2013-04-05 108 views
0

我剛剛學習C,有人可以解釋爲什麼在打印數組的第一個元素後,下面的代碼會產生分段錯誤?將字符串數組傳遞給函數C

工作代碼的外觀如何?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define ELEMENTS 8 

void make(char ***array) { 

*array = malloc(ELEMENTS * sizeof(char *)); 


    (*array)[0] = "test0"; 
    (*array)[1] = "test1"; 
    (*array)[2] = "test2"; 
    (*array)[3] = "test3"; 
    (*array)[4] = "test4"; 
    (*array)[5] = "test5"; 
    (*array)[6] = "test6"; 
    (*array)[7] = "test7"; 
    (*array)[8] = "test8"; 

} 

int main(int argc, char **argv) 
{ 
char **array; 
make(&array); 

int i; 
for (i = 0; i < ELEMENTS; ++i) { 
    printf("%s\n", array[i]); 
    free(array[i]); 
} 
free(array); 
return 0; 

}

+1

其實,你需要閱讀很多關於投注者,只是谷歌它,你會得到樂趣的信息... – Castiblanco 2013-04-05 13:35:16

回答

0

當你把一個文本字符串在C++一樣"test0",它實際上是存儲在一個特殊的存儲器位置不能被修改。在線

(*array)[0] = "test0"; 

你指着你的char*到那個內存位置,這是沒問題的。但是,稍後,當您撥打free(array[i]);時,您正試圖釋放相同的內存,這是一個禁忌。一般情況下,如果以前在同一變量上使用malloc(),則只能使用free()。另外,正如其他人所說的,由於您使用了9個元素,因此您需要分配一個9號數組。

6
  1. 你的數組大小是8,但你訪問索引8,這是一個過去的數組的末尾。如果您不明白,請計算元素的數量...

  2. 您在指定的字符串常量上調用free。不要這樣做。只有freemalloc,它只是array,而不是array[0]array[8]