C - динамическое выделение памяти с использованием двойного указателя - PullRequest
4 голосов
/ 09 июня 2011

Я выделяю некоторую память в имени функции myalloc () и использую и освобождаю ее в main (). Я использую двойной указатель, чтобы сделать это, вот код, который отлично работает,

//Example # 1

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

void myalloc( char ** ptr)
{
    *ptr = malloc(255);
    strcpy( *ptr, "Hello World");
}

int main()
{
    char *ptr = 0;
    myalloc( &ptr );
    printf("String is %s\n", ptr);
    free(ptr);

    return 0;
}

Но следующий код не работает и выдает ошибку сегментации. Я думаю, что это еще один способ использовать двойные указатели.

//Example # 2

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

void myalloc( char ** ptr)
{
    *ptr = malloc(255);
    strcpy( *ptr, "Hello World");
}

int main()
{
    char **ptr = 0;
    myalloc( ptr );
    printf("String is %s\n", *ptr);
    free(*ptr);

    return 0;
}

Пожалуйста, объясните мне, почему это вызывает ошибку сегмента во втором примере.

Примечание: язык = C, компилятор = GCC 4.5.1, ОС = Fedora Core 14

Кроме того, я знаю, что уже был задан некоторый вопрос, связанный с распределением памяти с использованием двойных указателей, но они не решают эту проблему, поэтому, пожалуйста, не отмечайте его как повторяющийся вопрос.

Ответы [ 3 ]

10 голосов
/ 09 июня 2011
char **ptr = 0;
*ptr = malloc(255);

пытается записать указатель, возвращаемый malloc, на адрес (типа char*), на который указывает ptr. Адрес оказывается ... 0, что не является записываемой памятью.

ptr должен указывать адрес, по которому вы можете написать. Вы можете сделать одно из следующего:

char *stackPtr; // Pointer on the stack, value irrelevant (gets overwritten)
ptr = &stackPtr;
// or
char **ptr = alloca(sizeof(char*)); // Equivalent to above
// or
char **ptr = malloc(sizeof(char*)); // Allocate memory on the heap
// note that ptr can be 0 if heap allocation fails
0 голосов
/ 09 июня 2011

Во втором случае вы передаете значение ptr main, равное 0 (NULL), myalloc() s ptr.myalloc() затем пытается разыменовать свой нулевой указатель, ptr.

0 голосов
/ 09 июня 2011
char **ptr = 0;
foo( ptr );

Вы передаете значение, на которое указывает ptr.Но вы еще не указали ptr ни на что.

*ptr = malloc(255);

Теперь вы присваиваете немного памяти этому «ничему».Так что это не будет работать, и будет segfault.Почему вы говорите, что это еще один способ использования двойных указателей?Я прошу прощения, если я ошибаюсь, но я думаю, что вы работали с типом программы в Turbo-C ранее?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...