簡體   English   中英

返回指針時出現分段錯誤

[英]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 = &plus; return ans; }
將 Sum 存儲在不同的變量plus並創建一個指針*ans指向該變量plus並返回保存plus地址的指針變量ans

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM