我想定义一个固定长度字符串的结构,如下所示:
typedef char str8[8];
所以我可以创建固定长度字符串数组,如:
str8 * mydata;
mydata = malloc(100 * sizeof(str8));
我使用mydata存储名称列表: 彼得 Waseels 性情乖戾的 Lexiunos Beta版 ...
一切正常,直到mydata [3],它变成LexiunosBeta而不是Lexiunos。然而,mydata [4]仍然只是测试版。
这似乎仅在尺寸(名称)> =尺寸(str8)时发生。我将str8扩展为str10作为临时解决方案,但我真的想知道真正的问题是什么以及如何解决它。
如果我将typedef char str8 [8]更改为更健壮的定义,例如: typedef {char * x;} str8;它会解决问题吗?
非常感谢你们!
答案 0 :(得分:3)
Lexiunos
是9个字节,计算尾随NUL
,你的typedef是char[8]
,你在数组的边界外写字。
看看this thread:
在这种特殊情况下,您将声明一个基于堆栈的数组。 根据具体实施,访问外部 数组的边界将只是访问已经的另一部分 分配堆栈空间(大多数操作系统和线程保留一定的部分 堆栈的内存。)
堆栈没有“自动扩展大小”,使用动态内存:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char *arr[] = {"Peter", "Waseels", "Grumpy", "Lexiunos", "Beta", /*...*/};
size_t size = sizeof arr / sizeof arr[0];
char **mydata;
size_t i;
mydata = malloc(size * sizeof(*mydata));
for (i = 0; i < size; i++) {
mydata[i] = malloc(strlen(arr[i]) + 1);
if (mydata[i] == NULL) {
perror("malloc");
exit(EXIT_FAILURE);
}
strcpy(mydata[i], arr[i]);
}
for (i = 0; i < size; i++) {
printf("%s\n", mydata[i]);
free(mydata[i]);
}
free(mydata);
return 0;
}