我想定义一个固定长度字符串的结构,如下所示:
typedef char str8[8];
这样我就可以创建固定长度字符串的数组,比如:
str8 * mydata;
mydata = malloc(100 * sizeof(str8));
我正在使用mydata存储一个名称列表:彼得Waseels暴躁的LexiunosBeta…
在mydata[3]之前一切都很好,它变成了LexiunosBeta而不是Lexiunos。然而,mydata[4]仍然只是测试版
只有当size(name)>=size(str8)时才会出现这种情况。我将str8扩展到str10作为一个临时解决方案,但我真的想知道真正的问题是什么,以及如何解决它。
如果我将typedef char str8[8]更改为更健壮的定义,如:typedef{char*x;}str8;它能解决问题吗?
非常感谢大家!
Lexiunos
是9个字节,计算后面的NUL
,而typedef是char[8]
,则在数组的边界之外进行写入。
看看这个线程:
在这种特殊的情况下,您将声明一个基于堆栈的数组。根据特定的实现,访问数组的边界将简单地访问分配的堆栈空间(大多数操作系统和线程都保留一定的部分堆栈的内存)。
对于堆栈来说,没有什么比"自动扩展大小"更好的了,请使用动态内存:
#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("%sn", mydata[i]);
free(mydata[i]);
}
free(mydata);
return 0;
}