You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 17:48:03