这个C结构赋值语句是否合法?

时间:2014-06-08 12:20:42

标签: c

这是一个代码示例,后跟我的问题:

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

struct st {

    char stringField[100];
    int intField;
};

typedef struct st st;

void test(st *parameterStruct)
{
    st localStruct;
    strcpy(localStruct.stringField, "HELLO");
    localStruct.intField = 5;

    *parameterStruct = localStruct;
}

int main()
{
    st myStruct;
    strcpy( myStruct.stringField, "XXX" );
    myStruct.intField = 9;

    printf("%s,%i\n", myStruct.stringField, myStruct.intField );

    test(&myStruct);

    printf("%s,%i\n", myStruct.stringField, myStruct.intField);

    return 0;
}

输出:

XXX,9
HELLO,5

我在想,因为结构&#39; localStruct&#39;它是在一个函数内创建的(不使用malloc)它具有局部作用域,因此一旦函数停​​止执行,它就可以自由地覆盖存储它的内存位置。但是,我尝试运行此示例程序并执行它没有任何问题。我以为第二次印刷声明会在屏幕上打印乱码,因为我指定了“我的结构”。到本地变量&#39; localStruct&#39; (对比&#39; localStruct&#39;动态分配)。我知道是否&#39; localStruct&#39;已经使用malloc创建了没有这样的问题。

我的问题是:分配结构变量&#39; myStruct&#39; (一个非动态局部变量)通过在函数测试中使用指针来确定和安全吗?我希望这个问题很清楚。

3 个答案:

答案 0 :(得分:9)

作业总是复制。

如果您执行类似*x = &y的操作(假设匹配的类型 - 例如,如果参数声明为st** x),则会复制y的地址,但是y很快就会超出范围,因为你担心这项任务会不安全。

但是,由于您正在执行*x = y(参数声明为st* x),您正在将y的内容复制到*x,所以即使y超出范围后,*x中存储的数据应该有效。

答案 1 :(得分:7)

是。这很安全。

分配时:

*x = y;

y的成员被复制到*x的相应成员中。它的工作方式就像你是会员一样成员自己复制。

答案 2 :(得分:1)

C允许结构分配。 如果两种结构属于兼容类型,则可以分配这两种结构。同时声明的两个结构是兼容的,并且使用相同“结构标记”或相同类型名称声明的结构也是兼容的。

在您提供的示例中,*xy都使用相同的结构类型名称st声明,两者都是兼容的,因此赋值*x = y是合法的。由于st x中的main创建了一个完整类型的结构,因此将其地址传递给函数是合法的。在您的函数中,作业*x = y只是将局部变量y的内容复制到*x,此更改为*x会保留并反映到x main中{{1}} 1}}。