1

我正在尝试使用双指针结构作为结构数组。 当我在main()中写入完整的代码时,它工作正常。 下面是工作代码:访问函数中的双指针结构

[email protected] 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; 
} 

[email protected] 
[email protected] ./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 

但是,当我在一个函数中使用相同的代码就无法正常工作。

[email protected] cp struct2.c struct1.c 
[email protected] 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 
[email protected] gcc -o struct123 struct1.c 
[email protected] ./struct123 
How many students? 
3 
Segmentation fault 
[email protected] 

你能帮我理解这个问题吗?

+0

有人喜欢VIM :) – Ben

+1

*始终*使用'GCC -Wall -Werror '。你的生活会更好,更好。 –

+0

我也建议'-Wextra',以及'-std = gnu99 -pedantic'。 – melpomene

回答

2
connections[i] = ... 

该行读取未初始化的变量connections。这会在两个程序中导致未定义的行为。 (也就是说,任何事情都有可能发生,包括看似“正常工作”。)

您可以通过循环之前做

connections = malloc(n * sizeof *connections); 

解决这个问题。


顺便说一句:

  • <malloc.h>是不是一个标准的头
  • 你不应该投malloc
  • 你应该检查错误(scanf可以失败,可以malloc失败等)
  • 1不是便携式退出状态/ main返回值(1表示unix和windows上有错误,但唯一的便携代码为0EXIT_SUCCESS,成功为EXIT_FAILURE)。
  • 传递&connections[i]->namescanf%s是错误的:%s需要char *&connections[i]->namechar (*)[32](来解决这个问题,删除&
+0

在实时编码中,我不知道我需要存储多少个条目。 – pavan