2

我一直在尝试创建一个动态分配的结构类型数组,label但失败得很惨。在我的 .h 文件中,我有:

    typedef struct _label {
            char name[256];
            char type[256];
            int address;
} label;

在我的 .c 文件中,我在顶部有这个:

    label* allLabels = (label*) malloc(sizeof(label) * 10); // line 10
    int arrayIndex = 0;

最后,我在同一个 .c 文件中有一个函数,用于将这些结构对象添加到数组中,以供文件中的其他方法使用:

    void addLabel(char line[], char type[], int addr) {
            label database;
            database.name = line; // line 805
            database.type = type; // line 806
            database.address = addr;
            allLabels[arrayIndex] = database;
            arrayIndex++;
        }

基本上我只想拥有一组可访问的标签。有人可以帮我理解我做错了什么吗?

我收到了这些错误,而且我也没有忘记任何必要的 #include 语句:

formatBuilder.c:10:3: error: initializer element is not constant
formatBuilder.c: In function 'addLabel':
formatBuilder.c:805:18: error: incompatible types when assigning to type 'char[256]' from type 'char *'
formatBuilder.c:806.18: error: incompatible types when assigning to type 'char[256]' from type 'char *'
4

2 回答 2

5

您不能分配给这样的char数组,您需要其中一种字符串操作,例如:

strcpy (database.name, line);  // or "->" if database is pointer

(最好事先检查长度以确保没有缓冲区溢出,或者根据您的需要使用更安全的功能)。

在 C中转换返回值也是一种不好的形式,malloc因为它可以隐藏某些细微的错误。如果您的代码也必须在 C++ 中编译,这是可以接受的,但您只需要确保您在范围内拥有正确的原型。


就初始化错误而言,我怀疑您在文件级别(在任何函数之外)有声明。这意味着您不能使用函数调用来初始化它,因为它具有静态存储持续时间并且希望在任何代码运行之前进行设置。

你可以这样解决这个问题:

// At file level:

label* allLabels = NULL;

// In your function:

void addLabel(char line[], char type[], int addr) {
    if (allLabels == NULL) {
        allLabels = malloc (sizeof(label) * 10);
        if (allLabels == NULL) {
            // malloc failed, do something to recover.
        }
    }
    // And we don't need local storage here, hit the array directly.

    strcpy (allLabels[arrayIndex].name, line);
    strcpy (allLabels[arrayIndex].type, type);
    allLabels[arrayIndex].address = addr;
    arrayIndex++;
}

这使用一个常量初始化器NULL来设置值,然后您只需要确保在第一次使用它之前分配它。

于 2013-04-26T04:16:24.263 回答
1

我建议使用memcpy

memcpy(&allLabels[arrayIndex], &database, sizeof(label));
于 2013-04-26T04:26:10.347 回答