![](/img/trans.png)
[英]fscanf is returning segmentation fault while my file pointer is not null
[英]Segmentation fault while returning pointer
我已經開始學習 C 語言中的指針。
當我嘗試在函數中返回指針時,出現segmentation fault
錯誤。
這是代碼:
#include<stdio.h>
int *sum(int *, int *);
int main(void)
{
int a, b;
int *ans = NULL;
printf("Enter number a : ");
scanf("%d", &a);
printf("Enter number b : ");
scanf("%d", &b);
ans = sum(&a, &b);
printf("Sum = %d", *ans);
return 0;
}
int *sum(int *p, int *q)
{
int *result = NULL;
*result = *p + *q;
return (result);
}
和輸出:
Enter number a : 10
Enter number b : 20
Segmentation fault
當result
被聲明為指針時, sum
函數中發生分段錯誤。 但是,我無法找出相同的原因。 任何有關這方面的幫助都是非常可觀的。
您正在初始化一個指向NULL
的指針,然后您正在推遲它:這是未定義的行為
將sum
函數更改為
int *sum(int *p, int *q)
{
int *result = malloc(sizeof(int));
// check if malloc returned a valid pointer before to dereference it
if (result != NULL)
{
*result = *p + *q;
}
return (result);
}
並添加一個free調用來釋放分配的內存。
// check if sum function allocate the pointer before to dereference it
if (ans != NULL)
{
printf("Sum = %d", *ans);
}
free(ans);
return 0;
}
您還可以避免使用指針返回值:
#include<stdio.h>
int sum(int *, int *);
int main(void)
{
int a, b;
int ans;
printf("Enter number a : ");
scanf("%d", &a);
printf("Enter number b : ");
scanf("%d", &b);
ans = sum(&a, &b);
printf("Sum = %d\n", ans);
return 0;
}
int sum(int *p, int *q)
{
int result = *p + *q;
return (result);
}
sum
函數也可以是這樣的:
int sum (int *p, int *q)
{
return (*p + *q);
}
編輯
正如@JonathanLeffler 在他的回答中所寫,您也可以這樣做:
#include<stdio.h>
void sum(int *, int *, int *);
int main(void)
{
int a, b;
int ans;
printf("Enter number a : ");
scanf("%d", &a);
printf("Enter number b : ");
scanf("%d", &b);
sum(&ans, &a, &b);
printf("Sum = %d\n", ans);
return 0;
}
void sum(int *result, int *p, int *q)
{
*result = *p + *q;
}
在嘗試存儲任何東西之前分配內存,並檢查malloc()
的返回
int *result = NULL;
result = malloc(sizeof(*result));
if(result != NULL)
*result = *p + *q;
else
printf("malloc returned error");
此外,檢查main()
函數的返回並相應退出。
int main(void)
{
.
.
.
ans = sum(&a, &b);
if(ans == NULL)
return 0;
printf("Sum = %d\n", ans);
free(ans); //free the memory then
return 0;
}
第三種選擇是在main
函數中將ans
聲明為普通的int
變量,並將指向它的指針傳遞給sum
函數,就像處理其他兩個參數一樣。 這實際上是模擬call by reference 。
#include<stdio.h> int *sum(int *, int *); int main(void) { int a, b; printf("Enter number a : "); scanf("%d", &a); printf("Enter number b : "); scanf("%d", &b); int* ans = sum(&a, &b); printf("Sum = %d", *ans); return 0; } int *sum(int *p, int *q) { int plus = *p + *q; int *ans = + return ans; }
plus
並創建一個指針*ans
指向該變量plus
並返回保存plus
地址的指針變量ans
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.