c - 使用 realloc 缩小结构内的字符串

标签 c string memory-management struct realloc

我有一个关于使用 realloc 函数的小问题。假设我有:

typedef struct
{
  char* location;
  int temp;
  int numberOfRec;
 }TEMP;

然后我在 main 中声明一个指向该结构的指针并分配内存:

int main()
{ 
  TEMP* data = xCalloc (1, sizeof(TEMP));  //wrapper function
  data->location = xCalloc (20, sizeof(char)); //wrapper function

}

现在,如果我在另一个函数中为 data->location 重新分配内存。我需要返回TEMP*数据的地址吗?

int main()
{

 someFunction(data); // Use this function or...
 //data = someFunction(data);
 ...
}
void someFunction(TEMP* data)
{
  ...
  data->location = xRealloc (data->location, 10 * sizeof(char));
}

最佳答案

没有。你不知道。这是因为 data 是指向结构的指针。每当您使用“->”运算符通过 data 访问结构的元素时,您首先会取消对指针的引用。

例如,

数据->位置 ==> (*data).location

此外,当你这样做时,

data->location = xRealloc(data->location, 10 * sizeof(char));

如果 realloc 失败,您将泄漏内存并可能调用未定义的行为(如果不包括 NULL 指针检查),因为 data->location 尚未free code>d 并且它将被分配为 NULL,因为 realloc 在失败时返回 NULL。

我建议您改为执行以下操作。

void *temp = NULL;
temp = xRealloc (data->location, 10 * sizeof(char));
if(temp == NULL)
{
    // realloc failed.
    free(data->location);
    data->location = NULL;
}
else
{
    // Continue
    data->location = temp;
}

我编译了一个minimal example为你。

关于c - 使用 realloc 缩小结构内的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16074177/

相关文章:

c - 是否可以在预处理时或编译时修改 "function call"

java - 在Java中将资源文本文件读取为字符串

java - 正则表达式根据确切的字符拆分,除非在它之前用反斜杠转义

memory-management - forrtl : severe (179): Cannot allocate array - overflow on array size calculation

c - 解决 munmap 警告消息

c++ - printf() 函数不起作用

c - REALTIME 时钟是否支持闰秒?

string - 需要有关 Excel 和 VBA 字符串处理和存储限制的信息 - 以及建议的解决方法

python - 我会赋值还是直接在其他变量中使用它们?

c - 为什么 minizip 不归档大文件(大于 4 GB)