typedef固定长度数组 - >自动扩展尺寸?

时间:2016-05-05 04:57:31

标签: c string malloc typedef

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

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;它会解决问题吗?

非常感谢你们!

1 个答案:

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