c-如何创建一个指向NULL的结构指针数组



我想创建一个结构指针数组,并将每个指针设置为null。最终,我希望数组中的指针指向我的结构。我相信我已经写了代码,但我一直有seg错误。

代码:

//struct in my .h
struct bin{
 double cac; // current available capacity
 struct node *list //pointer to linked list... bin struct points to linked list struct
}
//main file
void main(){
 struct bin *bArray[20];
 struct bin *binTemp, *pTemp;
 for(i=0;i<20;i++) bArray[i]= NULL;
}

我以为这会创建一个bin指针数组,但这里出现了seg错误。难道我不应该让所有的指针都为NULL,而不管它们是什么类型的指针吗?

最终,我想让这些都指向bin structs,我想我可以做到这一点,而不必首先将指针设为NULL,所以我尝试了:

for(i=0;i<20;i++){
  binTemp = (struct bin *)malloc(sizeof(struct bin));
    binTemp->cac = 1.0;
    binTemp->list = NULL;
    bArray[i] = binTemp;
}   

我又犯了一个seg错误。我不知道这里发生了什么。我知道seg错误意味着我试图写入一个非法的内存位置,这让我认为我必须用malloc设置数组索引的大小。然而,

for(i=0;i<20;i++) bArray[i]= malloc(sizeof(struct bin));

也给了我一个seg错误。我不知道自己做错了什么。

我运行的实际代码:

//Header File
#ifndef hBin_h
#define hBin_h
#include <stdio.h> // stdio used for file io
#include <stdlib.h> // standard c library 
#define MAX_S 20

//bin struc
struct bin {
    double cac; //current available capacity
    struct node *list; // pointer to linked list
};
//linked list node struct
struct node{
    char *name; //name of item
    double size; // weight of item
    struct node *next; //pointer to next
};
//insert the new item into a node in its appropriate location using alphabetical ordering of item names
struct node *oInsert(char *item, double size, struct node *head);
//print the items of the list out along with the list’s capacity
void traverse(struct node *head);
// deallocate the nodes of the list
void destory(struct node *head);
//input info from file - name of object, weight of object
void input(FILE *inFile, char item[], double *weight);
#endif // hBin_h
#include "hBin.h"

void main(){
  FILE *inFile;
  char *item;
  double *weight;
  struct bin *bArray[20];
  int i;
  struct bin *binTemp, *pTemp;

  inFile = fopen("run1.txt", "r"); //open file
  printf("HERE1n");
  for(i=0;i<20;i++){
      binTemp = (struct bin *)malloc(sizeof(struct bin));
      binTemp->cac = 1.0;
      binTemp->list = NULL;
      bArray[i] = binTemp;
  }   

/*while(!feof(inFile)){
input(inFile, item, weight);
printf("%s, %.2fn", item, *weight);
}*/
}

我使用了gdb(不完全确定我在这里做什么):

(gdb) run
Starting program: /home/Christopher/CSC362/Pass_F/Main
[New Thread 813244.0xc7590]
[New Thread 813244.0xc6ce0]
[New Thread 813244.0xc7320]
[New Thread 813244.0xc5994]
HERE1
      0 [main] Main 813244 cygwin_exception::open_stackdumpfile: Dumping stack trace to Main.exe.stackdump
[Thread 813244.0xc7320 exited with code 35584]
[Thread 813244.0xc6ce0 exited with code 35584]
[Inferior 1 (process 813244) exited with code 0105400]
(gdb) where
No stack.
(gdb) for(i=0;i<20;i++){
    binTemp->cac = 1.0;
    binTemp->list = NULL;
    bArray[i] = binTemp;
}   /usr/src/debug/cygwin-2.2.1-1/winsup/cygwin/crt0.c: No such file or     directory.
(gdb)   binTemp = (struct bin *)malloc(sizeof(struct bin));
Undefined command: "binTemp".  Try "help".
(gdb)     binTemp->cac = 1.0;
Undefined command: "binTemp->cac".  Try "help".
(gdb)     binTemp->list = NULL;
Undefined command: "binTemp->list".  Try "help".
(gdb)     bArray[i] = binTemp;
Undefined command: "bArray".  Try "help".
(gdb) }   for(i=0;i<20;i++){
Undefined command: "".  Try "help".
(gdb)   binTemp = (struct bin *)malloc(sizeof(struct bin));
Undefined command: "binTemp".  Try "help".
(gdb)     binTemp->cac = 1.0;
 Undefined command: "binTemp->cac".  Try "help".
 (gdb)     binTemp->list = NULL;
 Undefined command: "binTemp->list".  Try "help".
 (gdb)     bArray[i] = binTemp;
 Undefined command: "bArray".  Try "help".
 (gdb) }   for(i=0;i<20;i++){
 binTemp->cac = 1.0;
 Undefined command: "".  Try "help".
 (gdb)   binTemp = (struct bin *)malloc(sizeof(struct bin));
 Undefined command: "binTemp".  Try "help".
 (gdb)     binTemp->cac = 1.0;
 Undefined command: "binTemp->cac".  Try "help".
 (gdb)     binTemp->list = NULL;
 Undefined command: "binTemp->list".  Try "help".
 (gdb)     bArray[i] = binTemp;
 Undefined command: "bArray".  Try "help".

阅读您注释掉的代码,将变量weight传递给input函数,然后在对printf的调用中取消引用它。这里有一个主要问题,那就是变量weight没有初始化,将其传递给函数会通过值传递给,这意味着变量被复制了,函数只对副本而不是原始文件进行操作,这意味着main函数中的weight变量在取消引用时仍将未初始化,这将导致未定义的行为和可能的崩溃。

如果您打算模拟通过引用传递(您只能模拟,因为C没有通过引用传递),您应该声明weight为正常变量,并在调用函数时使用运算符的地址:

double weight;
...
input(inFile, item, &weight);
//                  ^
//                  |
// Note ampersand here

item变量也有类似的问题。它没有初始化,也没有指向任何特别的地方。除了初始化之外,以任何方式使用它都会导致未定义的行为。如果您试图在input函数中初始化它,那么您会遇到与上述相同的问题,并且您需要使用运算符的地址将指针传递给该指针。

如果没有初始化input函数中的item指针,而是像已经指向某个有效内存一样使用它(例如使用strcpy或类似函数),则也有未定义的行为。


你所经历的实际崩溃可能与我上面描述的问题完全无关,因为你似乎在做一些涉及链表的事情,当然这意味着指针,而错误使用的指针会给你带来更多未定义行为和崩溃的机会。

您应该做的第一件事是在构建时启用更多警告,因为编译器通常非常善于发现可能导致UB的可疑行为。您可以通过在构建时添加例如标志-Wall -Wextra -pedantic来实现这一点。

相关内容

  • 没有找到相关文章

最新更新