如何解决这个C程序安全吗?
我担心此程序中的内存泄漏。具体来说,check_if_pal
过程使str
指针递增以隐藏第一个字符。这会干扰自动内存分配吗?使用堆会更安全吗?返回之前我需要恢复str
吗?
这是代码:
# include <stdio.h>
# include <string.h>
int check_if_pal(char *);
int main(int argc,char *argv[]) {
char *not;
for (int i = 1; i < argc; i++) {
if (check_if_pal(argv[i])) {
not = " not";
} else {
not = "";
}
printf("%s is%s a palindrome.\n",argv[i],not);
}
return 0;
}
int check_if_pal(char *str) {
while (strlen(str) > 1) {
if (str[0] != str[strlen(str) - 1]) {
return 0;
}
str[strlen(str) - 1] = '\0';
str++;
}
return 1;
};
解决方法
此C程序安全吗?
由于您如何操纵str
指针,因此很难分析。根据代码的编写方式,证明程序是内存安全的可能非常容易,也可能非常困难。
例如,尝试仅调用一次strlen
并保持str
不变。这样一来,您将发现证明索引保持在范围内要容易得多。
我担心该程序中的内存泄漏。
因为没有分配,所以没有内存泄漏。
具体来说,check_if_pal过程增加了str指针以隐藏第一个字符。这会干扰自动内存分配吗?
不,不会。
使用堆会更安全吗?
这取决于环境,操作系统,编译器,使用的标志...
但是,通常来说,堆可以使错误更容易发现(尤其是在调试时),因为分配更加明确。
返回之前是否需要还原str?
不,指针是一个副本,因此您可以使用它进行任何操作。
,这里没有分配任何东西,所以不会有任何内存泄漏。
即使您有分配,也要记住一个指针本身并不代表分配,它指向已分配的内存 ,并且对于最终free()
来说是必要的。如果丢失了指针的跟踪,则更改指针不会使分配无效。
您可以随意更改str
之类的指针,这些指针可以根据需要任意更改,因为这只会影响该函数的局部作用域。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。