我正在使用C中的链表实现来获取指针和结构的悬念。以下是我的LL数据结构的基本代码:
struct Node {
void *data;
struct Node *next;
};
struct List {
struct Node *head;
};
void initList(struct List *list) {
list->head = 0;
}
struct Node *addFront(struct List *list, void *data) {
struct Node *newNode;
newNode->data = data;
newNode->next = list->head;
list->head = newNode;
return newNode;
}
以下是我在int main()
函数中运行的测试:
int main() {
/* test addFront */
double *data1;
double *data2;
*data1 = 10.5;
*data2 = 10.7;
struct List *newList;
initList(newList);
addFront(newList, data1);
printf("%s\n", newList->head->data);
addFront(newList, data2);
printf("%s\n", newList->head->data);
return 0;
}
我的问题是printf没有打印输出。现在看来,它显然不会打印,因为%s与数据类型不匹配,这是双倍的。如果我将字符串格式更改为%d,则会给出分段错误。如果我添加一个(double)强制转换,它会说第二个参数的类型为double *,这让我感到困惑,因为我认为->
符号取消引用了一个指针。
我迷路了。
答案 0 :(得分:3)
您正在解除引用data1
和data2
而不为其分配内存。尝试:
double data1 = 10.5;
addFront(newList, &data1);
或者你可以做一个malloc
,虽然在这种情况下我不认为你应该这样做。
另外,当您想要打印它们时,请尝试:
printf("%f\n", *(double *)newList->head->data);
答案 1 :(得分:3)
您没有为double
指针data1
和data2
分配内存。
看起来,实际上,你几乎没有为你的任何指针分配内存。
所有指针本身都是引用内存中的地址。它不分配支持引用的结构或变量所需的内存。
如果你有
double *data1; // or any other kind of pointer
你需要像
这样的东西data1 = (double *) malloc(sizeof(double));
那么你可以取消引用你喜欢的所有内容,例如
*data1 = 12.34;
但如果没有这个,你引用一个指向加尔各答黑洞的指针。
答案 2 :(得分:1)
你试图解决这个问题做了什么?
尝试使用“assert.h”来确保你的断言正确,或者使用puts / exit语句。
特别是,如果它不打印某些东西,显然你的打印不是你想要打印的东西,所以在某个地方,断言必须失败,你的思想会“点击”你错过了一步
我不能立即这样做的原因是因为我不是你而且我不知道你在做什么断言,所以放置它们比我要花更长的时间。
另外,如上所述,您没有为newNode分配内存,也没有访问导致分段错误的任意内存。
我修好了。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
struct Node {
void *data;
struct Node *next;
};
struct List {
struct Node *head;
};
void initList(struct List **newList)
{
struct List* tmpList = 0;
assert(newList != 0);
tmpList = (struct List*)malloc(sizeof(struct List*));
assert(tmpList != 0);
tmpList->head = 0;
*newList = tmpList;
}
void addFront(struct List* list, void* data)
{
struct Node* currNode = 0;
struct Node* prevNode = 0;
assert(list != 0);
assert(data != 0);
currNode = list->head;
while (currNode != 0) {
prevNode = currNode;
currNode = currNode->next;
}
if (prevNode == 0) {
list->head = (struct Node*)malloc(sizeof(struct Node));
list->head->data = data;
list->head->next = 0;
} else {
prevNode->next = (struct Node*)malloc(sizeof(struct Node));
prevNode->next->data = data;
prevNode->next->next = 0;
}
}
void test(const struct List *list)
{
const struct Node *iter;
assert(list != 0);
assert(list->head != 0);
iter = list->head;
while (iter != 0) {
assert(iter->data != 0);
printf("%f\n", *((double*)iter->data));
iter = iter->next;
}
}
int main()
{
double* data1 = (double*)malloc(sizeof(double));
double* data2 = (double*)malloc(sizeof(double));
*data1 = 10.5;
*data2 = 10.7;
struct List* newList = 0;
initList(&newList);
assert(newList->head == 0);
puts("pass[0].");
addFront(newList, data1);
assert(newList->head != 0);
assert(newList->head->data == data1);
puts("pass[1].");
addFront(newList, data2);
assert(newList->head != 0);
assert(newList->head->data == data1);
assert(newList->head->next != 0);
assert(newList->head->next->data == data2);
puts("pass[2].");
test(newList);
return 0;
}
答案 3 :(得分:1)
除了printf("%f")
之外,还有 4 malloc缺失:
我用###
标记了更改的行:
#include "stdlib.h"
#include "stdio.h"
struct Node {
void *data;
struct Node *next;
};
struct List {
struct Node *head;
};
void initList(struct List *list) {
list->head = 0;
}
struct Node *addFront(struct List *list, void *data) {
struct Node *newNode = malloc(sizeof(struct Node)); //###
newNode->data = data;
newNode->next = list->head;
list->head = newNode;
return newNode;
}
int main() {
/* test addFront */
double *data1 = malloc(sizeof(double)); //###
double *data2 = malloc(sizeof(double)); //###
*data1 = 10.5;
*data2 = 10.7;
struct List *newList = malloc(sizeof(struct List)); //###
initList(newList);
addFront(newList, data1);
printf("%f\n", *(double*)newList->head->data);//###
addFront(newList, data2);
printf("%f\n", *(double*)newList->head->data);//###
// TODO: free()'s //###
return 0;
}