【问题标题】:Why when I try to access array of structures it returns random values? (C)为什么当我尝试访问结构数组时它返回随机值? (C)
【发布时间】:2023-01-25 18:37:09
【问题描述】:

我有一个返回指向结构数组的指针的函数。但是,当我尝试访问返回结构的任何值时,它会打印随机符号。

#include <stdio.h>

struct MY {
   int i;
   char string[30];
};

struct MY* myFunc() {
  struct MY arrayOfStructs[3];
  struct MY tempStruct;
  struct MY* arrayOfStructsPtr = arrayOfStructs;

  tempStruct.i = 1;
  tempStruct.string[0] = 'H';
  tempStruct.string[1] = 'i';
  arrayOfStructs[0] = tempStruct;

  tempStruct.i = 2;
  tempStruct.string[0] = 'L';
  tempStruct.string[1] = 'o';
  arrayOfStructs[1] = tempStruct;

  tempStruct.i = 3;
  tempStruct.string[0] = 'M';
  tempStruct.string[1] = 'Y';
  arrayOfStructs[2] = tempStruct;

  return arrayOfStructsPtr;
}

int main()
{
   struct MY* arrayOfStructs = myFunc();
   for(int i = 0; i < 3; i++) printf("%d\n", arrayOfStructs[i].i);
   return 0;
}

【问题讨论】:

  • myFunc 返回时,您指向的数组不再存在,导致未定义的行为.
  • 比我怎样才能返回一个数组?
  • 它要么需要具有静态存储持续时间,要么您可以使用malloccalloc 分配内存。

标签: arrays c function struct return


【解决方案1】:

您返回对本地数组的引用,该数组在函数返回时停止存在。这是未定义的行为。

你需要:

struct MY* myFunc() {
  static struct MY arrayOfStructs[3];

或者

struct MY* myFunc() {
  struct MY *arrayOfStructs = malloc(3 * sizeof(arrayOfStructs));

或传递调用者分配的缓冲区。

struct MY *myFunc(struct MY *arrayOfStructs) {
   /* .... */

【讨论】:

    【解决方案2】:

    当函数返回时,您返回一个指向超出范围的局部变量的指针。两个不错的选择是:

    1. myFunc():将动态分配内存(malloc())。
    2. 在调用者中创建变量并将它们传递给myFunc()以进行初始化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-25
      • 2017-01-17
      • 2021-05-29
      相关资源
      最近更新 更多