我想创建一个结构指针数组,并将每个指针设置为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
来实现这一点。