在函数内的堆栈上创建一个结构体,并将其分配给在另一个函数中创建的数组的数组位置

标签 c arrays function struct

我需要从函数内初始化struct player的可变长度缓冲区。到目前为止,这是我想出的:

#include<stdio.h>
#include<stdlib.h>

struct player{
    char name;
};

void players_init(struct player **players){
    *players = malloc(2 * sizeof(struct player));
    struct player p1, p2;
    p1.name = 'X';
    p2.name = 'Y';

    (*players)[0] = p1;
    (*players)[1] = p2;
}

int main(int argc, char *argv[])
{
    struct player *players = NULL;
    players_init(&players);
    printf("%c\n", players[0].name); // prints X
    printf("%c\n", players[1].name); // prints Y

    return 0;
}

我的问题是:由于我是在函数内创建 p1p2 ,因此这两个变量应该分配在专用于同一函数的堆栈帧上,所以当该函数终止时,这些变量应该消失。

正如您从我的示例中看到的,我将这些变量分配给缓冲区 players 的位置,该缓冲区是在另一个函数中创建的。

我想知道为什么我的代码有效(如果它真的有效),因为我基本上引用了根据我的理解,当 players_init 终止时不应该再存在的变量。

我错过了什么?

最佳答案

因为您要将整个结构复制到数组中,所以它可以工作。如果您只是使用 p1p2 的地址,那么您将出现未定义的行为,因为正如您所说的 p1 和 p2` 会超出范围。

您的情况很简单,但在现实世界中,请注意您正在执行结构复制,因此您需要知道哪些位被复制,哪些没有被复制

关于在函数内的堆栈上创建一个结构体,并将其分配给在另一个函数中创建的数组的数组位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36241469/

相关文章:

c - C程序中出现段错误

c++ - 如何在 C++ 中查找函数的所有调用者?

将 ifaddr 的地址复制到 ifreq 结构

c++ - 哪些平台有 8 位字符以外的内容?

C 编程、结构体和多维数组

java - 无法计算折扣

javascript 数组设置深度值

python - 如何从 readline() 函数中去除字符串中的换行符?

c++ - 在 QtCharts (ChartView) 的 c++Function 中定义 qml 对象

c - 在C中创建链表时程序崩溃