这是一个代码示例,后跟我的问题:
#include#include 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; }
OUTPUT:
XXX,9 HELLO,5
我在想,因为结构'localStruct'是在一个函数内创建的(不使用malloc),它具有局部范围,因此一旦函数停止执行,它就可以自由地覆盖存储它的内存位置.但是,我尝试运行此示例程序并执行它没有任何问题.因为我将'myStruct'分配给局部变量'localStruct'(而不是动态分配的'localStruct'),所以我认为第二个打印语句会将乱码打印到屏幕上.我知道如果使用malloc创建了'localStruct',就不会出现这样的问题.
我的问题:是通过在函数测试中使用指针将结构变量'myStruct'(一个非动态局部变量)分配给y并且安全吗?我希望这个问题很清楚.
是.它是安全的.
分配时:
*x = y;
成员y
被复制到相应的成员中*x
.它的工作方式就像你自己成员一样.
作业总是复制.
如果你做了类似的事情*x = &y
(假设匹配的类型 - 如果参数被声明为st** x
,例如),你将复制地址y
,但由于y
很快就会超出范围,因为你担心,这项任务将是不安全的.
但是,由于您正在执行*x = y
(声明参数的位置st* x
),因此您正在复制y
to 的内容*x
,因此即使y
超出范围,存储的数据也*x
应该有效.