处理结构数组时内存损坏

时间:2015-08-18 22:07:25

标签: c arrays memory

我有一个看起来像这样的结构:

typedef struct SName
{
    char abc[10];
    float xyz;
} TName;

为了填补这个,我得到了一个函数,它基本上创建了一个TName并用strncpy填充值或为浮点值赋值。看起来像这样:

TName fillOne(){
     TName* myObj = (TName*)malloc(sizeof(TName));
     //fill values
    return *myObj;
}

这就像一个魅力,在XCode中用断点检查返回值表明所有值都被正确填充。 现在我要创建一个TNames数组:

TName *arrayOfTNames(){
    TName fullArray[100];
    *fullArray = *(TName*)malloc(100*sizeof(TName));
    //Now loop 100 times and do fullArray[count]=fillOne();
   return fullArray;
}

使用XCode检查少于100次迭代的样本我现在正好拥有我想要的东西,但在95插槽中我有随机内存值,不应该存在。 现在有两个问题: 1.我是否正确,直到我使用了从arrayofTNames()获得的结果之后才开始使用自由? 2.如何正确处理arrayOfTNames的返回值?

3 个答案:

答案 0 :(得分:3)

不必使用malloc来分配内存。你可以使用你的结构。

TName fillOne(){
   TName myObj;
   //fill values
  return myObj;
}

也可以使用,并返回myObj

的副本

无法返回数组,因此您必须将数组放入另一个结构中(并返回该结构),或者返回指向已分配内存的指针:

TName *arrayOfTNames(){
    TName* fullArray = malloc(100 * sizeof(TName));
    //Now loop 100 times and do fullArray[count] = fillOne();
   return fullArray;
}

然后在完成数组后不要忘记free内存。

答案 1 :(得分:1)

以下是您正在做的事情:

  • 在堆栈上创建一个100个元素的数组
  • 分配给该数组的第一个元素第一个TName大小的新堆内存
  • 为堆上的每个元素(在堆栈上)分配一个新的分配(并初始化)的堆上的TName元素

这几乎肯定不对。

你可能想要像

这样的东西
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

typedef struct SName {
  char abc[10];
  float xyz;
} TName;

TName* arrayOfTNames()
{
  TName *fullArray;
  fullArray = (TName *) malloc(100 * sizeof(TName));
  for(int i=0; i<100; ++i){
    strcpy(fullArray[i].abc, "whatever");
    fullArray[i].xyz=1.0;
  }
  return fullArray;
}

int main()
{
  TName* array = arrayOfTNames();
  for(int i=0; i<100; i++){
    printf("%s;%f\n", array[i].abc, array[i].xyz);
  }
}

答案 2 :(得分:0)

声明

min-device-width

堆栈上分配100个TName fullArray[100]; 类型的元素 - 一旦函数退出,它就会被销毁。

但是,下一行中的TName - 语句会分配上的元素,这些元素在函数退出后仍然存在。如果要在函数内创建数组并在外部使用它,则必须使用堆变体。例如:

malloc

请注意,无法在评论TName *arrayOf100TNames(){ TName *fullArray; fullArray = (TName*)malloc(100*sizeof(TName)); // Now loop 100 times and fill each individual struct return fullArray; } 中填写每个单独的结构。相反,你可以直接写每个元素,或者例如使用fullArray[count]=fillOne()memcpy的输出复制到数组元素中。