将c字符串解析为指针数组时出现分段错误

函数makearg应该计算char数组中的单词数,并将每个单词分解为指针数组中自己的位置。 分段错误似乎是strncpy函数的问题。

int makearg(char s[], char ***args); int main(){ char **args = (char**)(malloc(100)); char *str = "ls is a -l file"; int argc; argc = makearg(str, &args); printf("%d", argc); printf("%c", '\0'); int i; for(i = 0; i < argc; i++){ puts(args); printf("%c", '\n'); } return 0; } ///////////////////////////////////////// int makearg(char s[], char ***args){ int argc = 0; int charc = 0; int wordstart = 0; while(1){ if(s[charc] == '\0'){ strncpy(*args[argc], s + wordstart, charc - wordstart); args[argc][(charc - wordstart) + 1] = '\0'; argc++; break; } if(s[charc] == ' '){ strncpy(*args[argc], s + wordstart, charc - wordstart); args[argc][(charc - wordstart) + 1] = '\0'; wordstart = charc + 1; argc++; charc++; } else{ charc++; } } return argc; } 

 #include  #include  #include  #include  int makearg(const char s[], char ***args); int main(void){ char **args = NULL; const char *str = "ls is a -l file"; int argc = makearg(str, &args); printf("argc : %d\n", argc); int i; for(i = 0; i < argc; i++){ puts(args[i]); free(args[i]); } free(args); return 0; } int wordCount(const char *s){ char prev = ' '; int wc = 0; while(*s){ if(isspace(prev) && !isspace(*s)){ ++wc; } prev = *s++; } return wc; } int makearg(const char s[], char ***args /*out*/){ int argc = wordCount(s); int len; if(argc == 0){ *args = NULL; return 0; } *args = malloc(argc * sizeof(char*)); argc = 0; while(1){ while(isspace(*s)) ++s; if(EOF==sscanf(s, "%*s%n", &len)) break; (*args)[argc] = malloc(len + 1); strncpy((*args)[argc], s, len); (*args)[argc++][len] = '\0'; s += len; } return argc; } 

你为args指针数组分配了空间,但是你永远不会为你想要存储的字符串分配空间,所以当你尝试将字符串存储在makearg ,你正在解释任何随机垃圾作为指针,那就是不去上class。

此外,您只为指针数组分配100 个字节 – 不清楚您希望能分割多少个单词,但malloc调用应该看起来更像

 char **args = malloc(MAX_WORDS * sizeof(char *)); /* no cast required */ 

然后用循环来执行MAX_WORDS更多malloc调用,以便使用有效指针初始化args