这是一个代码示例,后跟我的问题:
#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; (一个非动态局部变量)通过在函数测试中使用指针来确定和安全吗?我希望这个问题很清楚。
答案 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允许结构分配。 如果两种结构属于兼容类型,则可以分配这两种结构。同时声明的两个结构是兼容的,并且使用相同“结构标记”或相同类型名称声明的结构也是兼容的。
在您提供的示例中,*x
和y
都使用相同的结构类型名称st
声明,两者都是兼容的,因此赋值*x = y
是合法的。由于st x
中的main
创建了一个完整类型的结构,因此将其地址传递给函数是合法的。在您的函数中,作业*x = y
只是将局部变量y
的内容复制到*x
,此更改为*x
会保留并反映到x
main
中{{1}} 1}}。