访问函数中的双指针结构
Accessing double pointer structures in a function
我试图使用双指针结构作为结构数组。
当我在 main() 中编写整个代码时它工作正常。
以下是工作代码:
xkumapu@lxapp-2 cat struct2.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <malloc.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>
typedef struct conn_s{
int no;
char name[32];
}conn_t;
int main(){
int i=0, n;
conn_t **connections;
printf("How many students?\n");
scanf("%d", &n);
for(i=0;i<n;i++){
connections[i] = (conn_t*)malloc(sizeof(conn_t));
printf("Enter no,name of student\n");
scanf("%d%s", &connections[i]->no, &connections[i]->name);
}
printf("The student details you entered are");
for(i=0;i<n;i++){
printf("%d %s", connections[i]->no, connections[i]->name);
free(connections[i]);
}
return 1;
}
xkumapu@lxapp-2
xkumapu@lxapp-2 ./struct2
How many students?
3
Enter no,name of student
1 pavan
Enter no,name of student
2 suresh
Enter no,name of student
3 ramesh
The student details you entered are1 pavan2 suresh3 ramesh
但是,当我在一个函数中使用相同的代码时,它不起作用。
xkumapu@lxapp-2 cp struct2.c struct1.c
xkumapu@lxapp-2 vi struct1.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <malloc.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>
typedef struct conn_s{
int no;
char name[32];
}conn_t;
int data(){
int i=0, n;
conn_t **connections;
printf("How many students?\n");
scanf("%d", &n);
for(i=0;i<n;i++){
connections[i] = (conn_t*)malloc(sizeof(conn_t));
printf("Enter no,name of student\n");
scanf("%d%s", &connections[i]->no, &connections[i]->name);
}
printf("The student details you entered are");
for(i=0;i<n;i++){
printf("%d %s", connections[i]->no, connections[i]->name);
free(connections[i]);
}
return 1;
}
int main(){
data();
return 1;
}
Entering Ex mode. Type "visual" to go to Normal mode.
:wq
"struct1.c" 41L, 874C written
xkumapu@lxapp-2 gcc -o struct123 struct1.c
xkumapu@lxapp-2 ./struct123
How many students?
3
Segmentation fault
xkumapu@lxapp-2
你能帮我理解这个问题吗?
connections[i] = ...
此行读取未初始化的变量connections
。这会导致两个程序出现未定义的行为。 (这意味着任何事情都可能发生,包括出现在 "work fine" 面前。)
您可以通过
解决这个问题
connections = malloc(n * sizeof *connections);
在循环之前。
顺便说一句:
<malloc.h>
不是标准 header
- 你不应该投
malloc
- 您应该检查错误(
scanf
可能会失败,malloc
可能会失败,等等)
1
不是可移植的退出状态/main
return 值(1
表示 unix 和 windows 上的错误,但唯一可移植的成功代码为 0
和 EXIT_SUCCESS
,错误代码为 EXIT_FAILURE
。
- 将
&connections[i]->name
传递给 scanf
%s
是错误的:%s
需要一个 char *
但 &connections[i]->name
是一个 char (*)[32]
(要解决此问题,请删除 &
)
我试图使用双指针结构作为结构数组。 当我在 main() 中编写整个代码时它工作正常。 以下是工作代码:
xkumapu@lxapp-2 cat struct2.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <malloc.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>
typedef struct conn_s{
int no;
char name[32];
}conn_t;
int main(){
int i=0, n;
conn_t **connections;
printf("How many students?\n");
scanf("%d", &n);
for(i=0;i<n;i++){
connections[i] = (conn_t*)malloc(sizeof(conn_t));
printf("Enter no,name of student\n");
scanf("%d%s", &connections[i]->no, &connections[i]->name);
}
printf("The student details you entered are");
for(i=0;i<n;i++){
printf("%d %s", connections[i]->no, connections[i]->name);
free(connections[i]);
}
return 1;
}
xkumapu@lxapp-2
xkumapu@lxapp-2 ./struct2
How many students?
3
Enter no,name of student
1 pavan
Enter no,name of student
2 suresh
Enter no,name of student
3 ramesh
The student details you entered are1 pavan2 suresh3 ramesh
但是,当我在一个函数中使用相同的代码时,它不起作用。
xkumapu@lxapp-2 cp struct2.c struct1.c
xkumapu@lxapp-2 vi struct1.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <malloc.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>
typedef struct conn_s{
int no;
char name[32];
}conn_t;
int data(){
int i=0, n;
conn_t **connections;
printf("How many students?\n");
scanf("%d", &n);
for(i=0;i<n;i++){
connections[i] = (conn_t*)malloc(sizeof(conn_t));
printf("Enter no,name of student\n");
scanf("%d%s", &connections[i]->no, &connections[i]->name);
}
printf("The student details you entered are");
for(i=0;i<n;i++){
printf("%d %s", connections[i]->no, connections[i]->name);
free(connections[i]);
}
return 1;
}
int main(){
data();
return 1;
}
Entering Ex mode. Type "visual" to go to Normal mode.
:wq
"struct1.c" 41L, 874C written
xkumapu@lxapp-2 gcc -o struct123 struct1.c
xkumapu@lxapp-2 ./struct123
How many students?
3
Segmentation fault
xkumapu@lxapp-2
你能帮我理解这个问题吗?
connections[i] = ...
此行读取未初始化的变量connections
。这会导致两个程序出现未定义的行为。 (这意味着任何事情都可能发生,包括出现在 "work fine" 面前。)
您可以通过
解决这个问题connections = malloc(n * sizeof *connections);
在循环之前。
顺便说一句:
<malloc.h>
不是标准 header- 你不应该投
malloc
- 您应该检查错误(
scanf
可能会失败,malloc
可能会失败,等等) 1
不是可移植的退出状态/main
return 值(1
表示 unix 和 windows 上的错误,但唯一可移植的成功代码为0
和EXIT_SUCCESS
,错误代码为EXIT_FAILURE
。- 将
&connections[i]->name
传递给scanf
%s
是错误的:%s
需要一个char *
但&connections[i]->name
是一个char (*)[32]
(要解决此问题,请删除&
)