簡體   English   中英

C結構錯誤:檢測到堆棧粉碎,異常中止(核心轉儲)

[英]C Struct Error: Stack Smashing Detected, Aborted (Core Dumped)

嗨,我正在使用“ struct”編寫一個簡單的C程序。 我試圖添加字符串(這似乎總是很麻煩),我終於可以編譯了,但是當我運行它時,我得到了一個錯誤。 文件名是“ struct”,這是錯誤的:

*** stack smashing detected *** ./struct terminated
Aborted (core dumped)

這是代碼:

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


struct members {

    int  id;
    int  age;
    char name[];
};
int main(void)
{
    struct members person;
    person.id = 1223;
    person.age = 37;
    strcpy(person.name, "Matthew");

    printf("ID: %d\n Age: %d\n Name: %s\n", person.id, person.age, person.name);

return 0;
}

我不知道為什么它編譯正常然后崩潰。 我想這是與字符串有關的代碼的內存問題。 有趣的是,它實際上可以正常工作並將信息打印到控制台,然后崩潰。 任何幫助表示贊賞。 謝謝。

嘗試這個。 您沒有為名稱分配內存。

struct members {

    int  id;
    int  age;
    char * name;
};
...
person.name=strdup("Matthew");

您沒有分配給struct membersname元素的內存。 執行strcpy您將在放置person的堆棧內存之外進行寫入,“粉碎”堆棧。

您需要通過聲明靜態分配給name元素的內存

char name[20];

或更好,動態地在main()使用

persons.name = calloc(1, strlen("Matthew") + 1);

問題是結構中沒有空間容納字符串“ Mathew”的字符。

關於這條線:

char name[];

建議更改為:

char *name;

然后,由於沒有分配數據的實際字節,因此只有一個指針可以通過指針進行設置。 IE瀏覽器

person.name = strdup( "Mathew" );

當然,請記住,在退出main()之前將指針傳遞給free()

free( person.name );

第二種(但IMO:不太理想的技術,因為它不知道所需的最大長度)可以將結構定義更改為:

struct members 
{
int  id;
int  age;
char name[100]; // arbitrary size, but must be large enough to hold max name string, including NUL termination byte
};

那么當前代碼將起作用:

strcpy(person.name, "Matthew");

暫無
暫無

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

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