2016-02-28 81 views
1

我想我現在已經修好了一切。我犯了增加environ變量的錯誤,而不是像數組那樣處理它並遍歷它。以下是我現在擁有的,應該很好去。使用malloc時出現分割錯誤

extern char **environ; 

int main(int argc, char *argv[]) { 
    // determine number of environment variables 
    int n = 0; 
    char *c = NULL; 
    while ((c = environ[n++]) != NULL) { 
     printf("%s\n", c); 
    } 
    printf("%s\n%d\n\n", c, n); 

    // allocate array to store character pointers to environment array 
    char **new_c; 
    printf("This prints\n"); 
    if ((new_c = malloc(n * sizeof(*c))) == NULL) { 
     printf("Error\n"); 
     exit(EXIT_FAILURE); 
    } 
    printf("This prints now too\n"); 
    free(c); 

    // sort array of character pointers 

    // parse each environment variable and output 

    exit(0); 
} 

要開始,我已經通過幾打的malloc閱讀這裏&段故障問題,並沒有似乎是我的一樣。這就是說,如果這是一個重複的問題,你會指點我的解決方案嗎?

大家好,我有一個使用malloc的問題。我編譯並運行了一次程序,malloc工作。然後我開始填充更多的代碼來解決問題,並且自第一次運行以來,我收到了分段錯誤。下面是我在它的代碼的最後工作狀態(仍然給人一種賽格故障錯誤雖然):

extern char **environ; 

int main(int argc, char *argv[]) { 
    // determine number of environment variables 
    int n = 0; 
    char *c = *environ; 
    while ((c = *environ++) != NULL) { 
     n++; 
     printf("%s\n", c); 
    } 
    printf("%s\n%d\n\n", c, n); 

    // allocate array to store character pointers to environment array 
    printf("This prints\n"); 
    if ((c = malloc((size_t) n)) == NULL) { 
     perror("Unable to allocate memory\n"); 
    } 
    printf("This does not print\n"); 
    free(c); 

    // sort array of character pointers 

    // parse each environment variable and output 

    exit(0); 
} 

程序應該因爲那時將用於進行排序,分析一個字符數組分配內存,並打印名稱值或值名稱對,具體取決於FORMAT值的設置。第一個循環工作並遍歷environ變量並打印出每個名稱 - 值對。我包括的兩個printf語句陳述了我在終端中看到的內容。有沒有人有任何想法我做錯了?

另外,我還使用下面的malloc線嘗試:

char *new_c = malloc((size_t) n); 
char *new_c = malloc(n); 
char *new_c = malloc(1); 
char *new_c = malloc(sizeof(n)); 
int *ptr = malloc((size_t) n); 

大概有幾個人我試過,但我還是百思不得其解。有幾行代碼,我不知道如何在早期如何搞定任何東西。另外,笑聲這裏是我所得到的,當我在終端使用免費(顯示我的可用內存):

   total  used  free  shared buff/cache available 
Mem:  3036836  1404340  902852  104712  729644  1491248 
Swap:    0   0   0 

我也打過電話以外的malloc if語句這樣:

c = malloc((size_t) n); 
if (c == NULL) { 
    perror("Unable to allocate memory\n"); 
} 

回答

3

這裏要修改的全球environ

while ((c = *environ++) != NULL) { 

while循環後,environ指向未初始化的內存。

malloc()尋找一些可以修改其行爲的環境變量,並且現在取消引用一個指向未初始化內存的指針。 使用這個:

int i = 0; 
while ((c = environ[i++]) != NULL) { 

這應該修復分段錯誤。

+0

好,打電話,這是我接下來要處理的問題。現在我沒有收到分段錯誤,但是此語句未打印出來: printf(「This does not print \ n」); – ZSButcher

+0

@ZSButcher嗯,它應該,我不明白爲什麼沒有。你能顯示完整的修改代碼嗎? – Ctx

+0

我錯誤地將if語句的條件更改爲!=。現在一切似乎都在起作用。感謝您的好眼睛! – ZSButcher

1

兩件事情是:

if ((c = malloc((size_t) n)) == NULL) { 
    perror("Unable to allocate memory\n"); 
} 

您分配n字節,在這裏。這聽起來像你想爲n指針分配空間char,所以你應該替換爲:

malloc(n * sizeof(char *)) 

如果這確實是你想要做什麼,然後cchar **,不char *,更好地仍然是:

c = malloc(n * sizeof *c) 

順便說一句,你似乎使用c兩個完全不同的東西。通常最好不要用變量來做這件事 - 因爲它會讓你的程序更難理解 - 而是使用一個變量循環來打印你的環境變量,而另一個變量來存儲你的動態分配的數組。

而且,你叫perror()如果malloc()失敗,但你只是繼續對上你的節目,就好像沒有錯誤。實際上,如果沒有其他人通過在報告後調用exit(EXIT_FAILURE),您應該回應這種性質的故障。

+0

將'n * sizeof(char *)'分配給'char *'。也許我錯了,但我懷疑OP想要這個。 – ameyCU

+0

我剛剛用你的malloc替換了我的malloc,我仍然遇到了Segmentation Fault。我也把退出電話放在那裏,謝謝你的注意。 – ZSButcher

+0

@ameyCU:好點,更新答案。 –