c - C 中包含结构的数组中的错误值

标签 c arrays visual-studio pointers struct

<分区>

我有这个结构:

(结构.h)

#pragma once

#ifndef STRUCT_H
#define STRUCT_H

typedef struct {
    unsigned int id;
    char *name;
    char *address;
} Struct;

#endif 

我制作了一个包含这些结构的动态数组。我还有一个循环,将一些数据放入这些结构中:

(主.c)

#include <stdio.h>
#include <stdlib.h>
#include "struct.h"

int main() {

    int nStructs = 3;

    Struct *structArray = calloc(nStructs, sizeof * structArray);

    char input[30];

    for (int i = 0; i < nStructs; i++) {
        structArray[i].id = i;
        sprintf(input, "name_%d", i);
        structArray[i].name = input;
        sprintf(input, "addr_%d", i);
        structArray[i].address = input;
    }

    for (int i = 0; i < nStructs; i++) {
        printf("\n[%04d]    ID: %d\n", structArray[i].id, structArray[i].id);
        printf("[%04d]  NAME:   %s\n", structArray[i].id, structArray[i].name);
        printf("[%04d]  ADDR:   %s\n", structArray[i].id, structArray[i].address);
    }

    free(structArray);
    return 0;
}

当我尝试运行此代码时,“int ID”以正确的方式打印,但“char *name”和“char *address”都包含循环中的最后一个值(在本例中为“addr_3 "):

(输出)

[0000]  ID:     0
[0000]  NAME:   addr_2
[0000]  ADDR:   addr_2

[0001]  ID:     1
[0001]  NAME:   addr_2
[0001]  ADDR:   addr_2

[0002]  ID:     2
[0002]  NAME:   addr_2
[0002]  ADDR:   addr_2

我尝试在 visual studio 中使用调试器,当将它们放入数组(第一个 for 循环)时,这些值看起来没问题,但在某些时候它们会被覆盖。由于我是 visual studio 的新手,我不知道如何在特定点而不是值 [i] 处查看数组的值。

我在这里做错了什么?

编辑: 我从我的主要项目中复制/粘贴了这段代码,所以只有即时测试的部分会出现问题。但我发现我忘了添加“free(structArray);”在“返回 0;”之上。现在将其添加到问题中,以免其他人犯同样的错误。

最佳答案

几乎准备好了一个示例,但后来我注意到了您的评论。

不,calloc 为您的结构而非字符串分配空间 - 您的结构仅存储指针。

如果你不想改变结构,你应该为每个字符串分配内存然后复制它而不是在所有情况下都存储指向相同元素的指针(在你的情况下,所有指针都指向 input )。 strdup 将为您完成:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "struct.h"

int main() {

    int nStructs = 3;

    Struct *structArray = calloc(nStructs, sizeof * structArray);

    char input[30];

    for (int i = 0; i < nStructs; i++) {
        structArray[i].id = i;
        sprintf(input, "name_%d", i);
        structArray[i].name = strdup(input);
        sprintf(input, "addr_%d", i);
        structArray[i].address = strdup(input);
    }

    for (int i = 0; i < nStructs; i++) {
        printf("\n[%04d]    ID: %d\n", structArray[i].id, structArray[i].id);
        printf("[%04d]  NAME:   %s\n", structArray[i].id, structArray[i].name);
        printf("[%04d]  ADDR:   %s\n", structArray[i].id, structArray[i].address);

        // Notice you now have to free those copies strings before your structs
        // go out of scope, or else you'll be leaking memory
        free(structArray[i].name);
        free(structArray[i].address);
    }

    return 0;
}

您可能想了解指针在 C/C++ 中的具体工作原理。

关于c - C 中包含结构的数组中的错误值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48264810/

相关文章:

c - 函数似乎没有修改数组

arrays - 如何将一组未知数量的参数传递给 MATLAB 中的函数?

wpf - 如何: WPF designer binding preview with Prism

c - 为什么我不必为 const 变量创建 malloc?

将字符串转换为 double

c - Ubuntu 11 上 GCC 的链接问题

c# - 数组,多维和锯齿状…在C#中

javascript - 如何在表单提交时添加嵌套对象?

c++ - 如何自定义我的按钮?

c++ - Visual Studio 2010 C++ 版本 : "mt.exe" error