我的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*)
是一个小数字,通常是四个或八个。
您没有为数据分配足够的内存,只分配了足够的内存来容纳指向数据的指针。