C - typedef 固定长度数组 - >自动扩展大小?



我想定义一个固定长度字符串的结构,如下所示:

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;
}

相关内容

  • 没有找到相关文章