我有一个看起来像这样的结构:
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的返回值?
答案 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)
以下是您正在做的事情:
这几乎肯定不对。
你可能想要像
这样的东西#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
的输出复制到数组元素中。