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

C语言中给char* const数组赋值(char*)0指针失败求助

问题分析与解决

错误根源

编译报错assignment of read-only location的原因很明确:你的Request结构体中,arguments被声明为char *const arguments[LENGTH]——这个定义意味着数组里的每个指针都是只读常量,你无法修改它们指向的地址,自然不能给req.arguments[counter]赋值(char*)0或者其他指针。

另外你的代码还藏着另一个风险:strcpy(req.arguments[counter], token)这行,arguments里的指针如果没预先指向有效内存,直接strcpy会触发未定义行为(比如段错误),因为你是往一个未初始化的指针指向的未知内存写数据。

解决方案

方案1:修改结构体定义(推荐)

既然你需要给arguments数组的指针赋值(包括最后加NULL终止符),直接去掉const限定:

#define LENGTH 1024 // 假设已定义该常量
typedef struct {
    char command[LENGTH];
    char *arguments[LENGTH]; // 移除const
    int arguments_size;
} Request;

之后修改代码逻辑,用strdup给每个token分配内存并复制(替代不安全的strcpy),最后赋值NULL:

char* token = strtok(command, " ");
int counter = 0;
// 留一个位置放终止NULL,避免数组越界
while (token != NULL && counter < LENGTH - 1) {
    if (counter == 0) {
        // 用strncpy防止缓冲区溢出
        strncpy(req.command, token, LENGTH - 1);
        req.command[LENGTH - 1] = '\0'; // 确保字符串终止
    }
    
    printf("Token: %s\n", token);
    // 分配内存并复制token内容
    req.arguments[counter] = strdup(token);
    if (req.arguments[counter] == NULL) {
        perror("内存分配失败");
        exit(EXIT_FAILURE);
    }
    counter++;

    token = strtok(NULL, " ");
}

req.arguments_size = counter;
req.arguments[counter] = NULL; // 这就是execv需要的(char*)0

注意事项

  • strdup需要包含<string.h>头文件,使用后要记得在不需要req时,遍历arguments数组释放每个非NULL指针,避免内存泄漏:
    for (int i = 0; i < req.arguments_size; i++) {
        free(req.arguments[i]);
    }
    
  • 加入counter < LENGTH - 1的判断,防止数组越界。

方案2:不修改结构体(不推荐)

如果因为某些约束不能修改结构体,你必须预先给arguments的每个元素分配固定内存(比如在初始化req时):

// 初始化req的arguments数组
Request req;
char arg_buffers[LENGTH][LENGTH];
for (int i = 0; i < LENGTH; i++) {
    req.arguments[i] = arg_buffers[i];
}

之后用strncpy填充每个token,但这种方式无法给数组末尾赋值NULL指针,不符合execv的要求,因此不推荐。

内容的提问来源于stack exchange,提问作者Dooney-dotcom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 04:50:44