请原谅从另一个站点复制粘贴,如以下站点:
我写了一个程序把数据存储在一个表中,像链表一样链接起来(不知道这是不是一个原始的想法——我自己想出来的,但可能不是一个新的想法)。它在Windows上编译成功,但当我运行它时,它只是说,
“dlt_table.exe遇到错误,需要关闭。”
我唯一一次遇到这个问题是有一次出于病态的好奇心,我试图取消对空指针的引用。意识到系统可能只是返回了malloc()
中的空指针,我尝试检查错误。还是没什么。
然后,我在我的Mac上试了一下。它构建起来没有问题,而且,更好的是,我提出的算法确实有效!但我还是不明白为什么它不能和窗户一起用。代码如下:
#include <stdio.h>
//#include <conio.h> (Windows only- taking it out for Mac dev)
#include <stddef.h>
#include <stdlib.h>
/*############################################################################*/
/*Node structure-- this is what the table is built off.*/
typedef struct dlt_node {
int value;
struct dlt_node *left, *right, *up, *down;
} dlt_node_t;
/*############################################################################*/
/*Function prototypes-- visible at bottom of file.*/
dlt_node_t *make_table(void);
int len_table(dlt_node_t *bucket);
int parse_table(dlt_node_t *bucket);
/*############################################################################*/
main()
{
dlt_node_t *bucket = make_table();
int table_size = len_table(bucket);
printf("Table size: %i\n", table_size);
parse_table(bucket);
//getch();
return 0;
}
/*############################################################################*/
/*Make a table, and return the table's bucket.*/
dlt_node_t *make_table(void)
{
/*Allocate structures.*/
dlt_node_t *bucket = (struct dlt_node*) malloc(sizeof(struct dlt_node));
dlt_node_t *node1 = (struct dlt_node*) malloc(sizeof(struct dlt_node));
dlt_node_t *node2 = (struct dlt_node*) malloc(sizeof(struct dlt_node));
dlt_node_t *node3 = (struct dlt_node*) malloc(sizeof(struct dlt_node));
/*Check for NULL's.*/
if(bucket == NULL || node1 == NULL || node2 == NULL || node3 == NULL){
printf("ERR: ENOMEM.\n");
// getch();
return;
}
/*Assign values, then pointers to other members of the table*/
bucket->value = 1;
node1->value = 2;
node2->value = 3;
node3->value = 4;
bucket->left = NULL;
bucket->right = node1;
bucket->up = NULL;
bucket->down = node2;
node1->left = bucket;
node1->right = NULL;
node1->up = NULL;
node1->down = node3;
node2->left = NULL;
node2->right = node3;
node2->up = bucket;
node2->down = NULL;
node3->left = node2;
node3->right = NULL;
node3->up = node1;
node3->down = NULL;
/*Return the table's bucket.*/
return bucket;
}
/*Find the number of nodes in the table. Skewed if nodes are randomly deleted.*/
int len_table(dlt_node_t *bucket)
{
dlt_node_t *probe_x, *probe_y;
int x = 0, y = 0;
for(probe_y; probe_y != NULL; probe_y = probe_y->right) y++;
for(probe_x;probe_x!=NULL;probe_x = probe_x->right) x++;
return x*y;
}
/*Parse the table, print values.*/
int parse_table(dlt_node_t *bucket){
dlt_node_t *current, *current_row = bucket;
for ( current_row; current_row!=NULL; current_row = current_row->down ){
current = current_row;
for ( current; current != NULL; current = current->right ){
printf( "Current value: %i\n", current->value );
}
}
}
很抱歉复制粘贴,Lockergnome.net上没有人有任何建议,他们建议在这里询问。
最佳答案
在函数len_table
中,尚未初始化指针probe_x
和probe_y
。(在c中,它们不是默认初始化为空的)。所以在循环的第一次迭代中,程序可能会崩溃。
关于c - 该程序可在Mac OS上运行,但不能在Windows上运行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4999155/