c - 这个 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 吗?
不,指针是一个副本,所以你可以做任何你想做的事情。
推荐阅读
- typescript - 条件检查后调用的打字稿类型检查函数
- python - Lxml 在云功能中不起作用?该怎么办?
- google-colaboratory - 是否有在 Colab 中使用 python 变量运行脚本的更新方法?
- blockly - 块状文本中的自动完成
- random - 添加随机效果时出现 bam 错误:数据必须是 data.frame
- android - ViewPager 如何作为 ViewGroup/Container 工作
- r - 在R中找到表格的起始坐标
- python - Numpy - 将矩阵的每个元素与同一位置的另一个矩阵的元素相乘
- python - 如何在 Windows 机器上 pip 安装 Linux 包(对于 AWS Lambda)?
- java - 无法通过 JDBC 禁用 Oracle 外键