[英]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 members
的name
元素的內存。 執行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.