如何创建一个结构指针数组为NULL

时间:2015-12-03 11:52:35

标签: c arrays pointers struct malloc

我想创建一个struct指针数组,并将每个指针设置为null。最终我想让数组中的指针指向我的结构。我相信我有写代码,但我一直遇到一个段错误。

代码:

//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结构,我想我可以做到这一点,而不必先使指针为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故障意味着我正在尝试写入非法内存位置,这让我觉得我必须使用malloc设置数组索引的大小。然而,

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

也给了我一个段错误。我不知道我做错了什么。

我运行的实际代码:

//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("HERE1\n");

  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, %.2f\n", 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".

1 个答案:

答案 0 :(得分:1)

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

如果您打算模拟按引用传递(您只能模拟,因为C没有通过引用传递),您应该将double weight; ... input(inFile, item, &weight); // ^ // | // Note ampersand here 声明为普通变量,并使用调用函数时的地址运算符:

item

input变量存在类似问题。它没有初始化,并没有指出任何特殊的东西。以任何方式使用它除了初始化它将导致未定义的行为。如果您尝试在item函数中初始化它,那么您遇到与上述相同的问题,并且您需要使用address-of运算符将指针传递给指针。

如果你没有初始化input函数中的strcpy指针,但是使用它就像它已经指向一些有效的内存一样(使用例如-Wall -Wextra -pedantic或者类似的函数)那么你有未定义的行为。

您遇到的实际崩溃可能与我上面描述的问题完全无关,因为您似乎正在做涉及链接列表的事情,这当然意味着指针和错误使用的指针将为您提供许多进一步未定义行为的机会。崩溃。

您应该做的第一件事是在构建时启用更多警告,因为编译器通常非常善于发现可能导致UB的可疑行为。你可以通过添加例如建造时标志#include <stdio.h> #include <stdlib.h> int addOne(); int main(int argc, char** argv) { char s[100]; int x = 1; x = addOne(x); printf("%d",x); gets(s); return (EXIT_SUCCESS); } int addOne(int j) { return j + 1; }