2016-12-07 45 views
2

我試圖寫它使用的realloc(),getchar函數()和一些指針運算存儲字符數組在內存中的小程序。我有一個名爲「inputArray」(在convert.c中)的函數,它接收一個指向char的指針(在main.c中聲明爲NULL),然後重新分配一個char,直到getchar()得到'\ n'字符。函數似乎工作正常,但是當我嘗試在main.c中打印字符串時,出現「分段錯誤(核心轉儲)」錯誤。我一直在尋找幾個小時,找不到問題所在。謝謝!嘗試使用realloc的(),獲得核心轉儲

的main.c:

# include "convert.h" 

int main() 
{ 
    char * string = NULL; 
    inputArray(string); 
    printf("%s", string);  
    free(string); 
    return 0; 
} 

convert.c:

#include "convert.h" 

void inputArray(char * array) 
{ 
    /*pointer to the array*/ 
    char * ptr = NULL; 

    /*stores the char*/ 
    char c = 0; 

    /*counter used for pointer arithmetic*/ 
    int count = 0; 

    /*loop for getting chars in array*/ 
    while ((c = getchar()) != '\n') 
    { 
     array = realloc(array, sizeof(char)); 
     ptr = array + count; 
     *ptr = c; 
     ++count; 
    } 

    /*add the null char to the end of the string*/ 
    array = realloc(array, sizeof(char)); 
    ptr += count; 
    *ptr = '\0'; 
} 

CONVERT.H:

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

void inputArray(char * array); 
+4

搜索並閱讀*模擬c *中的引用傳遞。 –

+0

'sizeof(char)'總是會是1 .....(好吧,如果你使用雙寬字符,也許是2),但它是一個固定的大小,這不是你想要的。 – gilez

回答

3

新分配的數組的大小不正確。你必須分配count + 1個字符。

array = realloc(array, (count + 1) * sizeof(char)); 

考慮到使用臨時指針重新分配內存更安全。否則,先前分配的內存的原始地址將會丟失。

而且這些語句

array = realloc(array, sizeof(char)); 
ptr += count; 

是錯誤的。你至少應該寫

array = realloc(array, count * sizeof(char)); 
ptr = array + count - 1; 

而且函數應該聲明如下

char * inputArray(char * array); 

而且必須以新的指針返回給調用者。

而且在主,你必須寫

string = inputArray(string); 

否則函數應該接受引用的論點是參數應該聲明如下

void inputArray(char ** array); 

並在功能相應處理。

2

你缺少在inputArray功能一個間接層。應該聲明如下

void inputArray(char **array) 

,它應該像下面這樣realloc'd(你還需要通過count + 1乘以增加數組的大小)

*array = realloc(*array, (count + 1) * sizeof(char)); 

這樣稱呼它:

inputArray(&string); 
+0

@BeyelerStudios哎呀,結果匆忙:-) –

+0

@BeyelerStudios謝謝你:-) –