【问题标题】:typedef fixed length array -> auto-extended size?typedef固定长度数组->自动扩展大小?
【发布时间】:2016-05-05 04:57:31
【问题描述】:

我想定义一个定长字符串的结构,像这样:

typedef char str8[8];

所以我可以创建 固定长度字符串的数组,例如:

str8 * mydata;
mydata = malloc(100 * sizeof(str8));

我正在使用 mydata 来存储名称列表: 彼得 瓦西尔斯 脾气暴躁 莱修诺斯 贝塔 ...

在 mydata[3] 之前一切正常,它变为 LexiunosBeta 而不是 Lexiunos。 mydata[4] 但是仍然只是测试版。

这似乎只在 size(name) >= size(str8) 时发生。我将 str8 扩展到 str10 作为临时解决方案,但我真的很想知道真正的问题是什么以及如何解决它。

如果我将 typedef char str8[8] 更改为更强大的定义,例如: typedef {char * x;}str8;能解决问题吗?

非常感谢大家!

【问题讨论】:

  • 超出范围的数组访问将调用未定义的行为

标签: c string malloc typedef


【解决方案1】:

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

【讨论】:

  • 非常感谢您的澄清!现在我看到了我的错误!需要学习良好的编码习惯!
猜你喜欢
  • 2011-05-30
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
  • 2014-11-15
  • 1970-01-01
  • 2012-12-29
  • 2018-11-17
相关资源
最近更新 更多