簡體   English   中英

C 結構:分段錯誤

[英]C structs: segmentation fault

關於結構的快速問題:

struct xint {
     int number;
     char string[12];
};

int main(int argc, char *argv[])
{
  struct xint offsets, *poffsets;
  poffsets=&offsets;
  FILE * pFile = fopen("file","rb");
  fread(poffsets,1,16,pFile);
  printf("Number %d\nString %s\n",offsets.number,offsets.string);
}

我得到這個輸出

Number 12345
Segmentation fault

我知道我可能在結構和指針以及內存分配方面做錯了什么。 提前致謝 :)

您的問題是您直接從文件中讀取結構,而不檢查結構對齊。 改為這樣做:

  fread(&offset.number,1,sizeof(offsets.number),pFile);
  fread(&offset.string,1,sizeof(offsets.string),pFile);

我懷疑您正在讀取的文件數據不會以NUL ( '\\0' ) 字符終止字符串。 根據 C 標准庫的printf()所遵循的 C 字符串定義,字符串必須以NUL字符終止。

您可能總是(通過代碼)確保.string[11] = '\\0'

或者,聲明string[13]並確保string[12] = '\\0'

此外,另一張海報提到了結構成員對齊問題。 這也是您必須解決的一個有效問題。

你得到緩沖區溢出。 您的字符串包含 12 個字符,但您沒有空間用於終止'\\0'

如果你這樣做:

struct xint {
     int number;
     char string[16]; // Make sure you have enough space for the string + '\0'.
};

int main(int argc, char *argv[])
{
    struct xint offsets, *poffsets;

    // Initialize your memory to 0. This will ensure your string is 
    // '\0'-terminated.
    // FYI, sizeof(xint) here is 20.
    memset(&offsets, 0, sizeof(xint)); 

    poffsets=&offsets;
    FILE * pFile = fopen("file","rb");
    fread(poffsets,1,16,pFile);
    fclose(pFile);
    printf("Number %d\nString %s\n",offsets.number,offsets.string);
}

那將解決問題。

我猜文件中的字符串不是以空字符結尾的,並且您的代碼也不會以空字符結尾的字符串。

fread(poffsets, 1, 16, pFile);
offsets.string[11] = '\0';
printf("Number %d\nString %s\n", offsets.number, offsets.string);

或者修改文件,使字符串以空字節結尾。

暫無
暫無

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

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