#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;
}
и вывод
(nil)
(nil)
(nil)
(nil)
(nil)
(nil)
(nil)
(nil)
(nil)
(nil)
(nil)
И ответ очевиден: вы разыменовываете нулевой указатель.
Теперь вы можете попытаться выяснить, почему вы передаете нулевой указатель на функцию. Поскольку программа состоит из 12 строк, обнаружение строки не займет слишком много времени:
ptr = 0;
Который присваивает указателю целое число ноль. Таким образом, указатель теперь равен нулю.