Завершить указатель на указатель? - PullRequest
0 голосов
/ 06 апреля 2011

Я не получаю предупреждения компилятора от этого, но это segfaults. Итак, как я могу скопировать '\ 0' в начале строки, чтобы я мог затем использовать strncat? (Использование strncpy не допускается и использование memcpy, а также завершение строкового сегмента также.)

Я написал это, чтобы проиллюстрировать проблему:

void func(char **str)
{
    *str = realloc(*str, -);
    *str[0] = '\0'; // I get segfault here.
    strncat(*str, -, -);

    // memcpy(*str, -, -);
    // *str[strlen(*str)] = '\0'; // I get segfault here.
}

int main(void)
{
    char *str = NULL;
    func(&str);
    return 0;
}

РЕДАКТИРОВАТЬ : Я хотел написать strlen (* str), а не strlen (str). К сожалению.

Ответы [ 2 ]

3 голосов
/ 06 апреля 2011

Проблема со второй строкой с ошибками - приоритет оператора.

[] имеет более высокий приоритет, чем *, поэтому *str[strlen(*str)] интерпретируется как *(str[strlen(*str)]), то есть разыменование адреса, на который указывает память в str + strlen(*str).

Вы хотите (*str)[strlen(*str)] - то есть символ в конце str - разыменован.

0 голосов
/ 06 апреля 2011

Ошибки сегментации возникают, когда память, к которой обращается программа, недействительна.Весьма вероятно, что вызов realloc не смог выделить объем запрошенной памяти.Перед тем как приступить к доступу, рекомендуется проверить, правильно ли выделена память.

Я пробовал эту программу и хорошо работает в моей системе.

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

    void func(char **str)
    {
        *str = realloc(*str, sizeof(char) * 20);
        if( *str == NULL)
        {
            printf("Memory allocation failed\n");
            return;
        }

        *str[0] = '\0';
        strncat(*str, "hello world", 11);  
        //memcpy(*str, "hello world", 11); //memcpy also works fine
        //(*str) [strlen(*str)] = '\0';   
        printf("String : %s\n", *str);
     }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...