【发布时间】:2021-11-01 14:51:37
【问题描述】:
我正在尝试了解有关结构和内存管理的一些内容。我有三个版本的代码,其结果是相同的。它们仅在结构的定义/分配上有所不同。在版本一中,该结构分配有以下代码:resultValue_t *resultVal = malloc(sizeof(resultValue_t));。在第二版中,结构是在函数内部创建的:resultValue_t resultVal;。在第三版中,resultValue_t resultVal; 是全局创建的。
我想问一下这三个定义实际上有何不同?哪一个给出了哪些可能性?哪个更受赞赏?
我知道如果通过指针访问结构,则应该使用-> 运算符等。但是在这里我很好奇这些定义之间的区别和可能性。
//version_1
typedef struct
{
int valOne;
int valTwo;
}resultValue_t;
void twoSum(int *array, int sum)
{
int baseVal, tempSum;
int arrLen = sizeof(array);
resultValue_t *resultVal = malloc(sizeof(resultValue_t));
//...
if (tempSum == sum)
{
resultVal->valOne = array[index];
resultVal->valTwo = array[nIndex];
printf("%d + %d\n", resultVal->valOne, resultVal->valTwo);
}
//...
free(resultVal);
}
//version_2
typedef struct
{
int valOne;
int valTwo;
}resultValue_t;
void twoSum2(int *array, int sum)
{
int baseVal, tempSum;
resultValue_t resultVal;
//...
if (tempSum == sum)
{
resultVal.valOne = array[index];
resultVal.valTwo = array[nIndex];
printf("%d + %d\n", resultVal.valOne, resultVal.valTwo);
}
//...
}
//version_3
typedef struct
{
int valOne;
int valTwo;
}resultValue_t;
resultValue_t resultVal;
【问题讨论】:
-
作为记录,最好像
typedef struct resultValue_t {...} resultValue_t;这样对你的结构进行 typedef,这样你就可以添加另一个 resultValue_t 结构作为它的变量(例如创建链表) -
变体 1 通常不推荐。如果您只需要函数内的结构,请将其保持在本地存储持续时间(所以变体 2)除非它的大小如此之大以至于您需要担心堆栈溢出。变体 3 不是线程安全的。但是,如果您仍然是单线程的,它可以(在大型结构的情况下)是变体 1 的有效替代方案,以节省动态内存分配(从而提高性能)。
-
OT:这个代码
int arrLen = sizeof(array);是....嗯...嗯,你从来没有我们arrLen所以很难说出你的期望,但是...从名字arrLen似乎您期望代码没有做的事情。只是警告:-) -
@4386427 是的,我知道 :) 这只是此函数中代码的一部分
-
@MrmDdda 你知道代码没有给你数组的长度!?它为您提供指针的大小(通常为 4 或 8)。
标签: c struct memory-management