【发布时间】:2018-06-24 04:35:39
【问题描述】:
我有这个结构:
(结构.h)
#pragma once
#ifndef STRUCT_H
#define STRUCT_H
typedef struct {
unsigned int id;
char *name;
char *address;
} Struct;
#endif
我创建了一个包含这些结构的动态数组。我还有一个循环将一些数据放入这些结构中:
(main.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);”上面的'return 0;'。它现在添加到问题中,因此其他人不会犯同样的错误。
【问题讨论】:
-
1) 为字符串分配空间。 2)实际复制数据给他们。
标签: c arrays visual-studio pointers struct