用C语言打印动态数组

用C语言打印动态数组,c,arrays,list,dynamic,C,Arrays,List,Dynamic,我正在用C编写一个程序。我在程序中使用了一个动态数组,并使用for循环遍历数组中的项。我遇到的问题是,当我将列表打印到屏幕(在for循环中)时,列表中以前的所有项目都会更改为最近创建的项目。我不知道是什么原因造成的。我已经在GDB中查看了很多次代码,但仍然找不到错误所在 /* For Loop, Displays Weapon List */ for (i = 1; i < num_places; i++) { printf("%d. \n",i); printf("Des

我正在用C编写一个程序。我在程序中使用了一个动态数组,并使用for循环遍历数组中的项。我遇到的问题是,当我将列表打印到屏幕(在for循环中)时,列表中以前的所有项目都会更改为最近创建的项目。我不知道是什么原因造成的。我已经在GDB中查看了很多次代码,但仍然找不到错误所在

/* For Loop, Displays Weapon List */
for (i = 1; i < num_places; i++)
{
    printf("%d. \n",i);
    printf("Des: %s \n\n",weap_List[i].description);
}

/* Add function, adds a weapon to the list */
int Add_weap(weapon new_weap) 
{
    if (num_places == num_allocated) 
    {
        if (num_allocated == 0)
                num_allocated = 3;
        else 
            num_allocated *= 2;
        void *_tmp = realloc(weap_List, (num_allocated * sizeof(weapon)));
        weap_List = (weapon*)_tmp;
    }
    num_places++;
    weap_List[num_places] = new_weap;
    return num_places;
}

/* Code that invokes the function, adding the weapon to the list */
printf("Adding new weapon \n");
weapon temp;
printf("Please enter the description of this new weapon. \n");
scanf("%s",weap.description);
Add_weap(temp);

/* Weapon structure */
typedef struct {
    char* description;
} weapon;
/*对于循环,显示武器列表*/
对于(i=1;i

如果你能给我指出正确的方向,我将不胜感激

您在错误的时间增加了num_位置

改变

  num_places++;
  weap_List[num_places] = new_weap;

一些快速的想法:

如果
\u tmp
被声明为
(武器*)tmp=realloc(…)
,那么您就不需要在下一行中使用
(武器*)

小题大做:增加196609年的武器时,将尺寸扩大一倍是相当昂贵的。每次只需增长八。(我从你们的名字猜,你们可能不会连续几周每秒添加一个项目。)

细微的挑剔:避免使用前缀变量名,它们是为C运行时环境保留的。是的,几乎每个程序都使用它们,是的,我使用过它们,是的,这一个可能是安全的:)但它们在技术上是保留的。简单的
tmp
就足够了


更大的挑剔:您没有检查来自
realloc(3)
的返回值。它可能会失败。您的应用程序应该尽可能优雅地处理故障。

因此,当您打印武器列表时,它会打印所有相同的内容?查看
武器的构造函数也会很有帮助。这样,您将跳过数组的第0个插槽。这是C,因此没有构造函数。但关键是——你能告诉我们你是如何分配/初始化你的
武器
结构的吗?D'oh:)没有做到这一点。捕捉得不错。没错,但这并不能解决OP的投诉,即当他打印出之前的元素时,所有元素都被更改为最近输入的
武器。sarnold——你能发布一下
武器
结构的定义吗?我提到这一点是因为当我使用一个简单的
struct武器{char description[40];}我没有OP的问题。我确实有你提到的第一个被跳过的问题,但是我没有OP的问题,所有的打印都是最近的一个。是的,如果我把它变成一个普通的字符串,它会工作。如果我这样做就不起作用:char*description;我想我在指针上犯了一个基本的错误,但我不确定。如果您的
说明
字段是
char*description
,您在哪里/如何为说明分配实际内存?
  weap_List[num_places++] = new_weap;
for (i = 1; i < num_places; i++)
{
   void *_tmp = realloc(weap_List, (num_allocated * sizeof(weapon)));
   weap_List = (weapon*)_tmp;