栈上char*指针初始化与使用问题:Instr相关代码段错误排查
问题分析与解决
你的核心问题是条件判断逻辑写反了,和内存分配(malloc)无关。
原代码的if (Qu == Instr(p, "qu", Equiv))存在两个致命问题:
- 当
Qu初始化为NULL时,只要Instr函数没找到"qu"返回NULL,NULL == NULL的判断就会成立,错误进入if块执行*(Qu+1)='$',直接触发段错误(因为NULL指针不可解引用)。 - 即使
Qu未初始化,它的值是随机的,和Instr的返回值匹配的概率极低,但一旦匹配(比如都为NULL),同样会触发错误。
正确的逻辑应该是先将Instr的返回值赋值给Qu,再判断这个值是否有效(非NULL),也就是只有当Instr找到"qu"时,才执行修改操作。修正后的代码有两种写法:
写法一(更清晰):
char *Qu = Instr(p, "qu", Equiv); if (Qu != NULL) { *(Qu + 1) = '$'; }
写法二(更紧凑):
if ((Qu = Instr(p, "qu", Equiv)) != NULL) { *(Qu + 1) = '$'; }
补充说明
你提到的malloc完全不需要,因为Instr函数的设计应该是返回指向原字符串p中"qu"起始位置的指针(前提是p指向的是可修改的内存,比如栈上的char数组、或者用malloc分配的可写内存)。只要Instr找到匹配的子串,返回的指针就是合法可写的,直接修改即可。
内容的提问来源于stack exchange,提问作者user20325193
相关产品推荐
相关产品推荐

