C程序中的奇怪行为,分配内存后变量损坏



我的C程序中有字符串的类型定义,它看起来像:

#define WRD_LEN 100
typedef char cstring[WRD_LEN];

然后在某个时刻,我声明这种类型的动态数组:

int pcount = 1;
cstring *options = malloc(sizeof(cstring*)*pcount);

我使用realloc:向这个数组添加新字符串

options = realloc(options, sizeof(cstring*)*pcount);
strcpy(options[pcount-1], //some string//);
pcount++;

然后向用户显示所有条目,用户选择其中一个条目,然后将该条目传递给另一个函数:

highestof(mode, l, options[btn]);

mode是一个整数,l是struct,但这些现在都无关紧要了。btn是用户选择的条目数(int)。到目前为止,一切都很好,问题出现在函数的highesto:中

void highestof(const int mode, List l, const cstring cat) {
List *p = malloc(sizeof(List*));

这是列表的定义:

struct W {
//some data
struct W *next;
};
struct List {
struct W *first;
};

因此,如果用options[1]调用highestof函数,cat变量将在调用malloc之后立即损坏(它将变成一组少数随机符号,如"#^?"或"^K^?"),即在创建列表的动态数组之前,我可以随心所欲地使用cat,但在调用malloc后,它会被损坏。最奇怪的是,只有当传递给该函数的变量位于索引为1的options数组中时(options[btn]其中btn=1),才会发生这种情况。对于btn的任何其他值,它都没有问题。

我找到了一个解决方法,我可以在调用malloc之前创建一个字符串(char s[100]),将cat值复制到其中并使用该变量,但这确实不能解决最初的问题,这真的让我很困扰。

sizeof(cstring*)*pcount太小。尺寸计算有误。


避免分配错误。将此习语用于更易于正确编写、审查和维护的代码
请注意,没有使用类型

pointer = malloc(sizeof *pointer * n);

然后代码变为:

// options = malloc(sizeof(cstring*)*pcount);
options = malloc(sizeof *options * pcount);`

cstring*只是一个指针,通常是四到八个字节。因此,sizeof (cstring*)是一个小数字,通常是四个或八个。

您没有为数据分配足够的内存,只分配了足够的内存来容纳指向数据的指针。

相关内容

  • 没有找到相关文章