簡體   English   中英

當我嘗試重新分配()結構指針數組時,為什么我的 C 程序會崩潰?

[英]Why does my C program crash when I try to realloc() a pointer array of structs?

在下面的代碼中,我嘗試使用 realloc() 擴展鍵值結構數組。

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

typedef struct {
    char key[25];
    char value[25];
} keyValPair;

void inputKeyVal(keyValPair* arr, int n) {
    char inputKey[25];
    char inputVal[25];
    printf("input key: ");
    scanf(" %24s", &inputKey);
    printf("input value: ");
    scanf(" %24s", &inputVal);
    n++;
    arr = (keyValPair*) realloc( (keyValPair*) arr, n*sizeof(keyValPair));
    strcpy(arr[n-1].key, inputKey);
    strcpy(arr[n-1].value, inputVal);
}

int main() {
    keyValPair initArr[] = {{"foo", "bar"}, {"a", "b"}};
    int n = sizeof(initArr)/sizeof(keyValPair);
    keyValPair* arr = malloc(n * sizeof(keyValPair));
    arr = initArr;
    inputKeyVal(arr, n);
}

但是,每當我運行它時,它都會運行到輸入提示符,然后在 realloc() 嘗試中崩潰。 我仍然無法弄清楚為什么或如何解決它。 對 C 來說相當新,所以非常感謝詳細的解釋,並且 go 會有很長的路要走。

我認為存在三個問題。

arr = initArr; initArr覆蓋arr的地址,這樣realloc就不能取到malloc分配的地址。 為了保留initArr分配的地址,應該將malloc的內容復制到arr中。

#include <stddef.h>

for (size_t i = 0; i < sizeof(initArr) / sizeof(initArr[0]); i++) {
   arr[i] = initArr[i];
}

scanf的最后一個參數是錯誤的。 &是不必要的。

scanf("%24s", inputKey);

inputKeyVal之后, mainarr丟失了有效地址,因為它在inputKeyVal中重新分配。 如果您需要由realloc重新分配的正確地址, inputKeyVal應該返回重新分配的地址。

keyValPair* inputKeyVal(keyValPair* arr, int n) {
  /* snipped */
  return arr;
}

int main() {
  /* snipped */
  arr = inputKeyVal(arr, n);
  /* do something for arr */
  free(arr);
  return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM