我製作了一個程序,將字符串分解爲由空格分隔的令牌,然後將每個單獨的字符串複製到一個字符串數組中。使用字符串數組的分段錯誤C
程序工作正常,直到達到for-loop,併成功將第一個字符串添加到數組中並打印出來後,程序崩潰。我調試它,發現
args[i] = malloc((strlen(comm_str) + 1) * sizeof(char));
返回SEGFAULT
然後執行第二次循環。同時調用堆棧打印出以下幾點:
地址:75F943F9,功能:strlen的(),文件:C:\ WINDOWS \ SysWow64資料\ msvcrt.dll.`
我試圖糾正自己的程序,但沒有結果。我首先想到的是,循環嘗試訪問出界區域,但我認爲我正確地使用了malloc。
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int main(){
char **args = NULL;
char input[] = "cmdline -s 20 -r -t parameter -p 20 filename";
int num = 0;
char *comm_str = strtok(input, " "); /*Tokens command line*/
while(comm_str != NULL){ /*Counts number of tokens*/
num++;
printf("%s %d\n", comm_str, strlen(comm_str));
comm_str = strtok(NULL, " ");
}
printf("\n");
args = malloc(num * sizeof(char*)); /*Allocates memory for the first string entry*/
if(!args){
return 0;
}
comm_str = strtok(input, " "); /*Starts tokening from beginning*/
for(int i = 0; i < num; i++){
args[i] = malloc((strlen(comm_str) + 1) * sizeof(char)); /*Allocates memory for strings*/
if(!args[i]){
for(int b = 0; b < i; b++){
free(args[b]);
}
free(args);
return 0;
}
strcpy(args[i], comm_str);
printf("%s\n", args[i]);
comm_str = strtok(NULL, " ");
}
printf("%d\n", num);
}
「返回段錯誤*然後* [...]」 - 再來? –
您可能會忘記正確分配內存。 args [0 ... num-1]也應該是malloc'd。 「然後返回SEGFAULT ......」聽起來不對。 – vpit3833
我認爲'then'是'when'的拼寫錯誤 – Barmar