Функция, принимающая пустой указатель в качестве аргумента и возвращающая пустой указатель - PullRequest
0 голосов
/ 27 февраля 2020

Я написал код в C, в котором я определил функцию, которая принимает void * в качестве аргумента и также возвращает void *. Я получаю несколько предупреждений и Segmentation Fault во время исполнения. Пожалуйста, дайте мне знать, если я делаю что-то глупое. Я несколько новичок во всем этом.

Код:

#include <stdio.h>
#include <stdlib.h>

void *fun1(void *a) {
    int temp = *((int*)a);             // Typecasting the received void* valud dereferencing it.
    temp++;
    return ((void*)temp);               // Returing the value after typecasting.
}

int main()
{
    printf("Hello World\n");
    int a =5;
    int *p = &a;
    int b = *p;

    printf("%d %d",a,b);

    int x = *((int*)fun1((void*)&b));     /*
                                             Here I am trying to send "b" to "fun1" function after doing a typecast.
                                             Once a value is receievd from "fun1" , I am typecasting it to int*.
                                             Then I am deferencing the whole thing to get the value in int format.
                                         */
    printf("\n%d",x);

    return 0;
}  

O / P:

main.c:8:13: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]                                                               
Hello World                                                                                                                                                
Segmentation fault (core dumped) 

Из отладчика GDB я обнаружил, что происходит ошибка сегментации в строке 20 после того, как значение возвращается из fun1(). Я подозреваю, что способ отправки значения b на fun1() неправильный.

Кроме того, почему промежуточный оператор printf в строке 18 printf("%d %d",a,b); не выполняется?

Ответы [ 3 ]

1 голос
/ 27 февраля 2020

On line return ((void*)temp); Вы преобразуете int temp в void*

. Обратите внимание, что получение адреса temp также недопустимо, потому что вы получите предупреждение warning: function returns address of local variable

.

Вы можете изменить функцию так, чтобы она возвращала int

int fun1(void *a) {
    int temp = *((int*)a);             
    temp++;
    return temp; // <-- Return the int value instead of a pointer.
}

, а затем изменить вызывающую функцию на

int x = fun1(&b); // <-- since fun1 now returns an integer there is no need to cast it.
0 голосов
/ 28 февраля 2020

Вы разыменовываете значение без указателя. Это отчет . Я скопировал сообщение об ошибке следующим образом.

=========== Начало # 0 сообщения времени выполнения stensal ===========

Ошибка времени выполнения: [разыменование a без указателя] Продолжение выполнения может привести к неопределенному поведению, прервать!

-
- Reading 4 bytes from an illegit address (0x6).
-
- Stack trace (most recent call first) of the read.
- [0]  file:/prog.c::23, 20
- [1]  [libc-start-main]
-

============ Сообщение об окончании # 0 во время выполнения stensal ====== ======

0 голосов
/ 27 февраля 2020

Спасибо @mschuurmans за указание на то, что проблема заключается в типе возврата fun1 (). Я изменил его сейчас, и он работает.

    void *fun1(void *a) {
    int temp = *((int*)a);
    temp++;
    int *p = &temp;
    return ((void*)p);
    }
...