我是C新手,無法繞過雙指針,並且不斷收到分段錯誤錯誤。我已經對程序進行了一些調試,找到了出錯的地方,但是不知道爲什麼。我首先發布我的代碼:使用雙指針的問題
int main() {
printf("Enter string to be split: \n");
a = readline();
String *st = newString(a);
String **split;
int num;
num = string_split(st, ',', split);
for (i=0; i<num; i++) { print_string(*(split+i)); }
}
的ReadLine()產生一個指向字符數組(由用戶輸入),並追加「\ 0」到它。 newString和print_string絕對有效。這裏是字符串的結構:
typedef struct {
char *chars;
int length;
int maxSize;
} String;
而這裏是string_split的代碼,這導致我所有這些麻煩。
int string_split(String *s, char delim, String **arrayOfStructs) {
char *c = getCharacters(s);
int len = length(s);
int begin = 0;
int end;
int arraycount = 0;
String **temp = (String**)malloc(sizeof(String*));
for (end=0; end<len+1; end++) {
if ((*(c+end) == delim || *(c+end) == '\0') && begin != end) {
String *st = substring(s,begin,end-1);
*(temp + arraycount) = st;
begin = end + 1;
arraycount++;
temp = (String**)realloc(temp, 1+arraycount*sizeof(String*));
}
}
arrayOfStructs = temp;
return arraycount;
}
主要是,當我重新分割時,它所指向的所有String *都消失了。當print_string獲取單個String *並嘗試抓取其中一個成員時,會發生分段錯誤。我不明白爲什麼,因爲我覺得每次都有必要分配內存,但是我覺得我錯過了一些東西。另外,在調試的時候,如果我通過string_split執行,temp的生成與我所期望的完全一致,所以我認爲我只是不是在某處應該處於什麼位置的malloc,而且它不是函數邏輯的問題。這裏是子字符串中的代碼,雖然我敢肯定它的工作原理,因爲我已經能夠從子字符串返回String *並將它們傳遞給print_string就好了。
String *substring(String *s1, int begin, int end) {
String *s = (String*)malloc(sizeof(String));
int length = 0;
s->maxSize = 20;
char *temp = (char*)malloc(20*sizeof(char));
char *arr = s1->chars;
int i;
for (i=begin; i <= end; i++) {
*(temp+length) = *(arr+i);
length++;
if (length == s1->maxSize-1) {
s1->maxSize = s1->maxSize+20;
temp = (char*)realloc(temp, s1->maxSize*sizeof(char));
}
}
*(temp+length) = '\0';
s->length = length;
s->chars = temp;
return s;
}
任何幫助,非常感謝!
AHHHHH沒關係有意義我。如果我想把它作爲函數參數中的雙指針,我該怎麼辦?如果我malloced分裂主要會做伎倆? – user3344699
@ user3344699是的,在函數外部分配會起作用,但是然後你無法在函數中重新分配它。 –