下面是一个代码示例,后面跟着我的问题:
#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
我认为,由于结构'localStruct‘是在函数中创建的(而不是使用malloc),因此它具有本地作用域,因此,一旦函数停止执行,存储它的内存位置就可以被重写。但是,我试着运行这个示例程序,它执行时没有任何问题。我认为第二个print语句将在屏幕上打印胡言乱语,因为我将'myStruct‘分配给局部变量'localStruct’(相对于动态分配'localStruct‘)。我知道如果使用malloc创建了'localStruct‘,就不会出现这样的问题。
我的问题是:在函数测试中使用指针将结构变量'myStruct‘(一个非动态局部变量)赋值给y可以吗?我希望问题是清楚的。
发布于 2014-06-08 04:29:26
任务总是复制的。
如果您执行类似*x = &y
的操作(假设类型匹配--例如,如果参数被声明为st** x
),那么您将复制y
的地址,但是由于y
很快就会超出范围,所以分配将像您担心的那样不安全。
但是,由于您正在执行*x = y
(参数声明为st* x
),所以要将y
的内容复制到*x
,所以即使y
超出了范围,存储在*x
中的数据也应该是有效的。
发布于 2014-06-08 04:29:09
是。这是安全的。
当你分配:
*x = y;
y
的成员被复制到*x
的相应成员中。它的工作方式就像你自己做了一个成员复制成员一样。
发布于 2014-06-08 06:06:03
C允许结构分配。如果是兼容类型的,则可以为它们分配两个结构。同时声明的两个结构()是兼容的,使用相同的“结构标记”(Structure Tag)或相同类型的名称声明的结构也是兼容的。
在您提供的示例中,*x
和y
都使用相同的结构类型名称st
声明,两者都是兼容的,因此赋值*x = y
是合法的。由于st x
in main
创建了一个完整类型的结构,将其地址传递给函数是合法的。在您的函数中,赋值*x = y
简单地将局部变量y
的内容复制到*x
,而对*x
的更改将持久化并反映到main
中的x
中。
https://stackoverflow.com/questions/24106097
复制相似问题