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
相关产品推荐
相关产品推荐

