Пустой указатель на целое число

#c

#c

Вопрос:

У меня есть метод printNums, в котором я хотел бы печатать целые числа от 1 до 10. Для моего назначения я должен malloc указателя int, установить его, передать в мою функцию в качестве точки void * и внутри функции, привести его, почитать и распечатать это целое число перед каждой итерацией счетчика.

Тем не менее, я продолжаю получать ошибку сегментации после *((int*)ptr) , и я не слишком уверен, почему. Любая помощь будет оценена.

Вот мой код:

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

void* printNums(void *ptr);

int main(int argc, char **argv)
{

  int *ptr = (int*)malloc(sizeof(int));
  ptr = 0;
  printNums(ptr);

  return 0;

}

void* printNums(void *ptr){

  int i = 0;

  for (i = 0; i <= 10; i  ){

    *((int*)ptr) = i; 

    printf("%dn", *((int*)ptr));

  } 

}
  

Комментарии:

1. printNums должно возвращать значение (типа void* )

2. ptr = 0; — здесь вы устанавливаете вновь выделенный указатель на NULL

3. int *ptr = (int*)malloc(sizeof(int)) выделяет память ровно для одного int , что, вероятно, не то, что вы предполагали.

4. printNums выводит 10 раз одно и то же число. Это то, что вы намеревались? Может быть, вам следует рассказать нам, что должна делать программа.

Ответ №1:

Вы присваиваете указателю ptr значение нуля. изменить ptr = 0; на *ptr = 0; .

Ответ №2:

Вы сбрасываете адрес на ноль:

 ptr = 0;
  

Это означает, что вы обязательно (в большинстве сред и операционных систем) получите ошибку сегментации, если попытаетесь получить к ней доступ.

Ответ №3:

Я думаю, вы хотели установить значение, на которое указывает ptr to 0 , прежде чем вы сможете использовать, поэтому по ошибке вы допустили ptr = 0

чтобы все значения, на которые указывает ptr to, были 0 , вам нужно использовать memset

memset(ptr,0,sizeof(int));

Ответ №4:

Тем не менее, я продолжаю получать ошибку сегментации после *((int*)ptr) , и я не слишком уверен, почему.

Вы можете попытаться выяснить это самостоятельно. Программирование требует некоторых навыков отладки — форумы не являются заменой.

 void* printNums(void *ptr){

  int i = 0;

  for (i = 0; i <= 10; i  ){

    printf("%pn", ptr);
    //*((int*)ptr) = i; 
    //printf("%dn", *((int*)ptr));
  } 
  return ptr;
}
  

https://godbolt.org/z/EYhGKn

и вывод

 (nil)
(nil)
(nil)
(nil)
(nil)
(nil)
(nil)
(nil)
(nil)
(nil)
(nil)
  

И ответ очевиден: вы разыменовываете нулевой указатель.

Теперь вы можете попытаться выяснить, почему вы передаете нулевой указатель на функцию. Поскольку программа состоит из 12 строк, обнаружение строки не займет слишком много времени:

 ptr = 0;
  

Который присваивает указателю целое число ноль. Таким образом, указатель теперь равен нулю.