2016-04-10 76 views
1

我想寫一個函數realloc 3數組,它是在使用malloc的主體中創建的,但每次我嘗試運行該程序時,都會收到一個錯誤消息並且程序停止工作。Realloc一個字符串數組

在我試圖進行調試時,我嘗試在「realloc」後面打印數組,並且它看起來像realloc已成功完成,但在我掃描到這些新記錄後,當我要打印時,出現錯誤。

更正1:按照建議更正了scanf行中的錯誤。一旦輸入第一條新記錄,程序就會發生錯誤

任何輸入值得讚賞!

void addRecord(char** firstName,char** lastName, float* score, int * recordSize) 
{ 
    int add,i; 
    printf("How many records do you want to add? "); 
    scanf("%d", &add); 

    firstName = realloc(firstName, (*recordSize+add)*sizeof(char*)); 
    for (i=*recordSize; i<(*recordSize)+add; i++) 
     firstName[i]= malloc(STRSIZE*sizeof(char)); 

    lastName = realloc(lastName, (*recordSize+add)*sizeof(char*)); 
    for (i=*recordSize; i<(*recordSize)+add; i++) 
     lastName[i]= malloc(STRSIZE*sizeof(char)); 

    score = realloc(score, (*recordSize+add)*sizeof(float)); 
    printf("Please enter the record to be added: \n"); 
    printf("FirstName LastName Score\n"); 

    for (i=*recordSize; i<*recordSize+add; i++) 
     scanf("%s %s %f", firstName[i], lastName[i], &score[i]); 
    *recordSize +=add; 
} 
+1

scanf()的'%s'格式規範需要'char *',但你提供'char **'。 'firstName [i]'已經是'char *'了,所以你不需要使用'&'運算符。 –

+0

你應該總是發佈[mcve]。 –

回答

0

您應該知道,如果指針地址更改,您的重新分配將不會在主函數中可見。您正在重新分配整個字符串數組,但是此更改只發生在您的addRecord()函數中。當您回到主要功能時,您可能有dangling pointer,因爲realloc()可以返回一個新的內存地址並釋放原始內存塊。即printf("%p\n", firstName);可以在addRecord()中打印不同的東西,並在addRecord()返回後打印您的主要功能。

例如:

#include <stdio.h> 

/* Simulate the reallocation of bar by swapping oldbar and bar. */ 
void foo(int *bar) 
{ 
    static int *oldbar = NULL; 

    if (oldbar == NULL) { 
     oldbar = bar; 
     bar = NULL; 
    } else { 
     bar = oldbar; 
     oldbar = NULL; 
    } 

    printf("bar after reallocating is: %p\n", (void *)bar); 
} 

/* Notice the extra * below and the dereferencing of the pointer, allowing 
    main() to see the change. */ 
void foo_works(int **bar) 
{ 
    static int *oldbar = NULL; 

    if (oldbar == NULL) { 
     oldbar = *bar; 
     *bar = NULL; 
    } else { 
     *bar = oldbar; 
     oldbar = NULL; 
    } 

    printf("bar after reallocating is: %p\n", (void *)bar); 
} 

int main(void) 
{ 
    int bar[] = {1, 1, 2, 3, 5, 8}; 
    int *barptr = bar; 

    printf("barptr before reallocating is: %p\n", (void *)barptr); 
    foo(barptr); 
    printf("barptr after reallocating is: %p\n\n", (void *)barptr); 

    printf("barptr before reallocating is: %p\n", (void *)barptr); 
    foo_works(&barptr); 
    printf("barptr after reallocating is: %p\n", (void *)barptr); 
} 

對於字符串數組,你只需要到另一個*添加到參數和間接引用,因爲我在foo_works()的定義一樣。這樣你就有了一個指向數組的指針,它允許你的主函數可以看到變化。當然,這意味着你將是一個Three Star Programmer,你可能會考慮重構使用結構來替代你的記錄......

+0

謝謝!三星編程作品!結構是我想到的第一件事。不幸的是,作業要求不能使用任何結構。 –

1
scanf("%s %s %f", firstName[i], lastName[i], &score[i]); 

你使用的是指針的指針,以你的記憶。放下'&',然後發送一個指向你的記憶的指針到scanf()

+0

是不是最後一個arg應該是'&score [i]'? – stackptr

+0

@stackptr是的。我會編輯。好點子。 – Logicrat

+0

我同意它已被更正。但是這並沒有完全解決這個問題。 –

相關問題