为什么当我试图访问结构数组时,它返回随机值?(C)

ih99xse1  于 2023-01-29  发布在  其他
关注(0)|答案(2)|浏览(83)

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

#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;
}
mlmc2os5

mlmc2os51#

你返回了一个对局部数组的引用,当函数返回时,这个数组就不再存在了。这是未定义的行为。
您需要:

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

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

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

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

如果动态分配内存,则应在使用后对其进行free

z2acfund

z2acfund2#

当函数返回时,返回一个指向超出作用域的局部变量的指针。
1.调用方main()分配变量并将其传递给myFunc()进行初始化。

#include <stdio.h>
#include <string.h>

#define N 3

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

void myFunc(struct MY arrayOfStructs[N]) {
    char *strings[N] = { "Hi", "Lo", "MY" };
    for(size_t i = 0; i < N; i++) {
        arrayOfStructs[i].i = i + 1;
        strcpy(arrayOfStructs[i].string, strings[i]);
    }
}

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

在这里,你并不需要存储i,因为它只是struct + 1的索引。

  1. myFunc()动态分配malloc()的变量并返回指针。调用者负责释放分配的内存。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N 3

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

struct MY *myFunc() {
    struct MY *arrayOfStructs = malloc(N * sizeof *arrayOfStructs);
    if(!arrayOfStructs) return NULL; // malloc failed
    char *strings[N] = { "Hi", "Lo", "MY" };
    for(size_t i = 0; i < sizeof strings / sizeof *strings; i++) {
        arrayOfStructs[i].i = i + 1;
        strcpy(arrayOfStructs[i].string, strings[i]);
    }
    return arrayOfStructs;
}

int main() {
    struct MY *arrayOfStructs = myFunc();
    if(!arrayOfStructs) return 1;
    for(int i = 0; i < N; i++)
        printf("%d\n", arrayOfStructs[i].i);
    free(arrayOfStructs);
}
  1. myFunc():使变量成为静态(不推荐)。

相关问题