C语言函数内通过传引用修改字符串触发崩溃问题求助
问题触发原因
核心原因是C语言运算符优先级问题:
- 后缀运算符
[]的优先级远高于一元解引用运算符*,你写的*str[count++]会被编译器解析为*(str[count++]),而非你期望的(*str)[count++]。 str是存储单个char*变量地址的二级指针,str[count]的含义是从str指向的地址开始,偏移count * sizeof(char*)个字节后读取对应的char*值:当count >= 1时,访问的已经是进程非法栈内存,解引用操作直接触发段错误。- 你测试
str[0][count++]可以正常运行的逻辑是:str[0]等价于*(str + 0)也就是*str,拿到了malloc返回的堆内存首地址,再通过[count++]偏移访问就是合法的字符数组操作,因此不会崩溃。
正确实现方案
首先要通过括号修正优先级逻辑,同时补充边界处理、资源释放等逻辑,完整可运行代码如下:
#include <stdio.h> #include <stdlib.h> int secureInput(char **str, int size); int main(int argc, const char * argv[]) { char *mystring = NULL; int ret = secureInput(&mystring, 10); if (ret == 0) { printf("%s\n", mystring); free(mystring); // 释放malloc申请的堆内存,避免泄漏 mystring = NULL; } return 0; } int secureInput(char **str, int size) { // 入参合法性校验 if (str == NULL || size <= 0) { return -1; } *str = (char*)malloc(sizeof(char) * size); if (*str == NULL) { return -1; } int c = 0; unsigned int count = 0; while((c = getchar()) != '\n' && count < size - 1) { // 预留1位存结束符 (*str)[count++] = c; // 加括号明确优先级,先解引用拿到字符串首地址再偏移 } (*str)[count] = '\0'; // 保证字符串一定以'\0'结尾 // 清空输入缓冲区剩余字符,避免影响后续输入操作 if (c != '\n') { while ((c = getchar()) != '\n' && c != EOF); } return 0; }
修正点说明:
- 对
*str加括号明确运算优先级,先拿到malloc分配的字符串首地址,再做下标偏移访问 - 循环判断条件改为
count < size -1,预留1个字节存储字符串结束符,避免越界 - 增加入参合法性校验、输入缓冲区清理逻辑
- main函数中补充内存释放逻辑,避免内存泄漏
内容的提问来源于stack exchange,提问作者Liwinux
相关产品推荐
相关产品推荐

