我想知道sample1和sample2之间有什么区别。为什么有时我必须将结构作为参数传递,有时我可以在不将其传递给函数的情况下执行此操作?如果samplex函数需要多个结构来处理它会怎样?你会传递几个结构作为论据吗?
struct x
{
int a;
int b;
char *c;
};
void sample1(struct x **z;){
printf(" first member is %d \n", z[0]->a);
}
void sample2(){
struct x **z;
printf(" first member is %d \n", z[0]->a); // seg fault
}
int main(void)
{
struct x **z;
sample1(z);
sample2();
return 0;
}
答案 0 :(得分:1)
首先,你的参数类型不是struct,而是指向struct的指针(或指向struct的指针数组 - 从被调用者的角度来看,它们在语义上是等价的,除了数组的地址可以'改变)。
在第二种情况下,您使用的局部变量完全独立于main
中具有相同名称的局部变量。由于它未初始化,因此在尝试访问其中一个成员时会出现seg错误。 (main
中的那个也没有初始化,但访问它似乎只是偶然在sample1
)。
您应该在使用之前初始化变量,否则您将进入未定义行为的区域。 E.g。
void sample1(struct x **z){
printf(" first member is %d \n", z[0]->a);
}
void sample2(){
struct x z[1];
z[0].a = 1;
...
printf(" first member is %d \n", z[0].a);
}
int main(void)
{
struct x z[1];
z[0].a = 1;
...
sample1(z);
sample2();
return 0;
}
答案 1 :(得分:0)
两者都无效并且访问不良内存。结果未定义,因此两种结果都是正确的。
答案 2 :(得分:0)
C和C类语言具有“范围”的概念。查看所有花括号({
和}
)?那些是“块”。它们基本上将它们之间的所有代码包装成独立于同一级别的任何其他块的包。您在该块中创建的任何变量只能在该块中访问 - 您无法在其他任何位置引用它。
您可以创建嵌套块。例如:
int f() {
int x;
scanf("%d", &x);
if (x == 3) {
return 7;
}
else {
return x;
}
}
如您所见,else
块嵌套在函数块中,因此可以访问函数的变量。
当您在struct x **z
和main
中声明sample2
时,实际上您创建了两个变量,均称为z
。这些是完全独立的 - 它们根本不是同一个变量。他们没有关系。他们唯一的共同点是他们的名字和类型 - 实际价值是不同的。在两者中使用相同变量的唯一方法是传递,就像在sample1
中一样。
当然,目前,你的z
指针是垃圾 - 你没有分配任何东西。我建议你在尝试取消引用之前先在里面存放一些东西。
答案 3 :(得分:0)
您的声明
struct x **z;
只是创建一个指向x类型结构的指针。你实际上并没有初始化指针,即让它们指向任何地方。
尝试类似
的内容struct x z;
struct x *pZ = &z;
sample1(&pZ);
(我不完全确定你实际想要实现的目标!)