我有一个结构如下
struct cmd{
char **tokenized_cmd;
int num_params;
}
在带签名的某些功能中 我有以下
void parse_cmd(cmd, char *line){
char *token;
char *saveptr;
char *delim_space;
char *delim_comma;
char *delim_new_line;
char **result;
int i;
int j=0;
command.num_params = 0;
delim_space = " ";
delim_comma = ",";
delim_new_line = "\n";
if(line!=NULL){
line = strtok(line,delim_new_line);
token = strtok_r(line,delim_space,&saveptr);
}
result[j]=token;
j++;
for (i=0;i<3;i++){
token = strtok_r(NULL, delim_comma, &saveptr);
if(token!=NULL){
result[j] = token;
j++;
}else{
result[j]='\0';
break;
}
}
command.tokenized_cmd = result;
command.num_params = j;
if(command.tokenized_cmd[0] == '\0'){
printf("empty");
}
}
为什么这段代码:
if(command.tokenized_cmd[0] == '\0'){
printf("empty");
}
导致访问错误?
这似乎无法解决问题:
command.tokenized_cmd = malloc(sizeof(result));
for(i=0;i<j;i++){
command.tokenized_cmd[i]= malloc(sizeof(result[i]));
command.tokenized_cmd[i] = result[i];
}
command.num_params = j;
答案 0 :(得分:1)
您似乎没有为result
分配空间,因此此步骤无法提供任何可访问的内容:
command.tokenized_cmd = result;
如果result
正在存储多个字符串,那么您需要分配空间来存储char *
个字符串malloc()
。
此外,对于每个单独的字符串或char *
,您需要为{em> 分配malloc()
的空间。
当您完成result
或tokenized_cmd
并且不再需要它时,您可能需要使用free()
来恢复您已分配的内存,防止内存泄漏。对于你完成的双指针(char **
),你必须释放字符串和指向这些字符串的指针。