C 中的链表,大数的加法。分段故障
Linked list in C, addiotion of big numbers. SEGMENTATION FAULT
我正在做一个项目,我应该用 C 编写一个程序,我可以在其中添加最多 500 位数字的数字。
我想我接近一个工作程序,但当我 运行 程序时,我不断收到消息 "Segmentation fault"。
我已经用谷歌搜索了这个,但似乎你会从很多不同的原因中得到这个错误,你只需要弄清楚是哪个...
我对 C 不是很熟悉,所以我想你们可以帮助我吗?
到目前为止,这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// ----------------------------- STRUCTEN --------------------------
typedef struct node *nodeptr;
struct node{
int data;
nodeptr next;
};
// ----------------------------- MAIN -------------------------------
int main(){
// Det krävs 3 listor. En för tal1, en för tal2 och en för svaret.
nodeptr list1 = NULL;
nodeptr list2 = NULL;
nodeptr answer = NULL;
// Allokerer minnet för listorna.
list1 = malloc(sizeof(nodeptr));
list2 = malloc(sizeof(nodeptr));
answer = malloc(sizeof(nodeptr));
creat_linked_list(list1, list2, answer); // Skapar de länkade listorna.
char first_number[1000]; // Det första talet får max vara 1000 tecken.
printf("Enter the first number: ");
scanf("%s",first_number);
char second_number[1000];
printf("Enter the second number: ");
scanf("%c",second_number);
int l1 = fill_list(list1, first_number);
int l2 = fill_list(list2, second_number);
addition(list1, list2, answer);
return;
}
// ------------------------------ skapa den linkade listan -----------------------------
creat_linked_list (nodeptr list1, nodeptr list2, nodeptr answer){
// Påbörjar listorna.
list1 -> next = NULL;
list2 -> next = NULL;
answer -> next = NULL;
list1 -> data = 0;
list2 -> data = 0;
answer -> data = 0;
}
// ------------------------------------ Fyller i listorna -----------------------------
int fill_list (nodeptr pointer, char number[]) {
int x = 0;
int lenght = strlen(number);
while (x < lenght){
int digit = (int)number[x] - (int)'0'; //'0' = 48, tas bort från number[x] för att det är ascii-kodat.
nodeptr temp = NULL;
temp = malloc(sizeof(nodeptr));
temp -> next = pointer -> next;
pointer -> next = temp;
temp -> data = digit;
x = x + 1;
}
return lenght;
}
// --------------------------------------- Kod för addition av tal -------------------
addition(nodeptr list1, nodeptr list2, nodeptr answer){
int digit1, digit2;
int sum, carry;
while(1){
if ((list1 -> next != NULL)&&(list2 -> next != NULL)){
list1 = list1 -> next; //Tar ut plats i lista 1
digit1 = list1 -> data; //Tar ut värdet på den platsen.
list2 = list2 -> next; // --- || --- 2
digit2 = list2 -> data; // --- || ---
}
else{
if((list1 -> next = NULL)&&(list2 ->next != NULL)) {
digit1 = 0; // Eftersom att det inte finns fler siffror i tal 1
list2 = list2 -> next; // Samma som IF-satsen innan.
digit2 = list2 -> data;
}
else{
digit2 = 0; //// Eftersom att det inte finns fler siffror i tal 2
list1 = list1 -> next;
digit1 = list1 -> data;
}
}
nodeptr temp = NULL;
temp = malloc(sizeof(nodeptr));
temp -> next = NULL;
temp -> data = (digit1 + digit2 + carry)%10;
answer -> next = temp;
answer = answer -> next;
if ((digit1 + digit2 + carry) > 9) {
carry = 1;
}
else{
carry = 0;
}
if((list1 -> next = NULL)&&(list2 ->next = NULL)) {
break;
}
}
if (carry){ // Om det ligger kvar en carry efter att alla tal har blivit adderade
// så går vi in här.
nodeptr temp = NULL;
temp = malloc(sizeof(nodeptr));
answer -> next = temp;
answer -> data = carry;
answer -> next = NULL; // Markerar slutet av answer listan.
}
}
当我 运行 代码时,我到达了需要输入第一个数字的部分。之后代码崩溃,我得到了分段错误。
请帮忙!
int 不支持 500 位数字,C int 只能从 -2^15+1 到 +2^15-1
检查 this question 以了解有关 C 变量范围的更多信息。
您的一个问题,以及最有可能导致崩溃的原因,很容易找到:
list1 = malloc(sizeof(nodeptr));
list2 = malloc(sizeof(nodeptr));
answer = malloc(sizeof(nodeptr));
那些 malloc
调用仅将 nodeptr
的大小分配给结构,而不是结构本身。这将只有四个或八个字节,而您的结构可能有八个或十二个字节大。
除了其他问题,您还有
printf("Enter the second number: ");
scanf("%c",second_number);
// -----^
您只读取了 1 个字符,稍后使用 second_number
作为字符串。它不是空终止的,因此当用作字符串时可能会导致段错误。
我正在做一个项目,我应该用 C 编写一个程序,我可以在其中添加最多 500 位数字的数字。
我想我接近一个工作程序,但当我 运行 程序时,我不断收到消息 "Segmentation fault"。
我已经用谷歌搜索了这个,但似乎你会从很多不同的原因中得到这个错误,你只需要弄清楚是哪个...
我对 C 不是很熟悉,所以我想你们可以帮助我吗?
到目前为止,这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// ----------------------------- STRUCTEN --------------------------
typedef struct node *nodeptr;
struct node{
int data;
nodeptr next;
};
// ----------------------------- MAIN -------------------------------
int main(){
// Det krävs 3 listor. En för tal1, en för tal2 och en för svaret.
nodeptr list1 = NULL;
nodeptr list2 = NULL;
nodeptr answer = NULL;
// Allokerer minnet för listorna.
list1 = malloc(sizeof(nodeptr));
list2 = malloc(sizeof(nodeptr));
answer = malloc(sizeof(nodeptr));
creat_linked_list(list1, list2, answer); // Skapar de länkade listorna.
char first_number[1000]; // Det första talet får max vara 1000 tecken.
printf("Enter the first number: ");
scanf("%s",first_number);
char second_number[1000];
printf("Enter the second number: ");
scanf("%c",second_number);
int l1 = fill_list(list1, first_number);
int l2 = fill_list(list2, second_number);
addition(list1, list2, answer);
return;
}
// ------------------------------ skapa den linkade listan -----------------------------
creat_linked_list (nodeptr list1, nodeptr list2, nodeptr answer){
// Påbörjar listorna.
list1 -> next = NULL;
list2 -> next = NULL;
answer -> next = NULL;
list1 -> data = 0;
list2 -> data = 0;
answer -> data = 0;
}
// ------------------------------------ Fyller i listorna -----------------------------
int fill_list (nodeptr pointer, char number[]) {
int x = 0;
int lenght = strlen(number);
while (x < lenght){
int digit = (int)number[x] - (int)'0'; //'0' = 48, tas bort från number[x] för att det är ascii-kodat.
nodeptr temp = NULL;
temp = malloc(sizeof(nodeptr));
temp -> next = pointer -> next;
pointer -> next = temp;
temp -> data = digit;
x = x + 1;
}
return lenght;
}
// --------------------------------------- Kod för addition av tal -------------------
addition(nodeptr list1, nodeptr list2, nodeptr answer){
int digit1, digit2;
int sum, carry;
while(1){
if ((list1 -> next != NULL)&&(list2 -> next != NULL)){
list1 = list1 -> next; //Tar ut plats i lista 1
digit1 = list1 -> data; //Tar ut värdet på den platsen.
list2 = list2 -> next; // --- || --- 2
digit2 = list2 -> data; // --- || ---
}
else{
if((list1 -> next = NULL)&&(list2 ->next != NULL)) {
digit1 = 0; // Eftersom att det inte finns fler siffror i tal 1
list2 = list2 -> next; // Samma som IF-satsen innan.
digit2 = list2 -> data;
}
else{
digit2 = 0; //// Eftersom att det inte finns fler siffror i tal 2
list1 = list1 -> next;
digit1 = list1 -> data;
}
}
nodeptr temp = NULL;
temp = malloc(sizeof(nodeptr));
temp -> next = NULL;
temp -> data = (digit1 + digit2 + carry)%10;
answer -> next = temp;
answer = answer -> next;
if ((digit1 + digit2 + carry) > 9) {
carry = 1;
}
else{
carry = 0;
}
if((list1 -> next = NULL)&&(list2 ->next = NULL)) {
break;
}
}
if (carry){ // Om det ligger kvar en carry efter att alla tal har blivit adderade
// så går vi in här.
nodeptr temp = NULL;
temp = malloc(sizeof(nodeptr));
answer -> next = temp;
answer -> data = carry;
answer -> next = NULL; // Markerar slutet av answer listan.
}
}
当我 运行 代码时,我到达了需要输入第一个数字的部分。之后代码崩溃,我得到了分段错误。
请帮忙!
int 不支持 500 位数字,C int 只能从 -2^15+1 到 +2^15-1
检查 this question 以了解有关 C 变量范围的更多信息。
您的一个问题,以及最有可能导致崩溃的原因,很容易找到:
list1 = malloc(sizeof(nodeptr));
list2 = malloc(sizeof(nodeptr));
answer = malloc(sizeof(nodeptr));
那些 malloc
调用仅将 nodeptr
的大小分配给结构,而不是结构本身。这将只有四个或八个字节,而您的结构可能有八个或十二个字节大。
除了其他问题,您还有
printf("Enter the second number: ");
scanf("%c",second_number);
// -----^
您只读取了 1 个字符,稍后使用 second_number
作为字符串。它不是空终止的,因此当用作字符串时可能会导致段错误。