Присвоение значения указателю char непосредственно после того, как mallo c вызывает ошибку сегментации - PullRequest
0 голосов
/ 27 января 2020

Я пытаюсь выполнить простую обработку строк (strcat) на массиве символов. Я попробовал 2 подхода.

В первом случае я выделяю память для char *, а затем присваиваю значение через scanf (). Этот подход работает нормально.

void fun1(char** s1) {
    char temp[15] = "&Superman";
    printf("inside fun1 %s %s\n",(*s1),temp);
    strcat((*s1),temp);
}

int main()
{
    char *str;
    str = malloc(sizeof(char)*15);
    scanf("%s",str);
    fun1(&str);
    printf("1st string %s\n",str);

    return 0;
}

O / p соответствует ожидаемому для этого случая

Batman
inside fun1 Batman &Superman
1st string Batman&Superman

Во втором подходе я присваиваю значение str непосредственно в основном ( ) без scanf ().

void fun1(char** s1) {
    char temp[15] = "&Superman";
    printf("inside fun1 %s %s\n",(*s1),temp);
    strcat((*s1),temp);
}

int main()
{
    char *str;
    str = malloc(sizeof(char)*15);
    str = "Batman";
    fun1(&str);
    printf("1st string %s\n",str);

    return 0;
}

В этом случае я получаю ошибку сегментации внутри fun1 () во время выполнения strcat.

inside fun1 Batman &Superman
Segmentation fault (core dumped)

GDB o / p из OnlineGDB

(gdb) r                                                                           
Starting program: /home/a.out                                                     
inside fun1 Batman &Superman                                                      

Program received signal SIGSEGV, Segmentation fault.                              
__strcat_sse2_unaligned ()                                                        
    at ../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S:666                    
666     ../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S: No such file or direc
tory.                                                                             
(gdb) bt                                                                          
#0  __strcat_sse2_unaligned ()                                                    
    at ../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S:666                    
#1  0x00000000004006a3 in fun1 (s1=0x7fffffffebd8) at main.c:9                    
#2  0x00000000004006e4 in main () at main.c:17                                    
(gdb)             

Я в замешательстве, потому что строка "Batman" может печататься внутри fun1 (), но ее strcat не работает, хотя я делаю одно и то же для обоих случаев.

Заранее спасибо за любую помощь.

1 Ответ

3 голосов
/ 27 января 2020

Когда вы делаете

str = "Batman";`

str, больше не указывает на память mallo c. Это указывает на строковый литерал "Бэтмен". Поэтому вам не разрешено объединять другую строку.

Чтобы увидеть это, добавьте простую печать - попробуйте:

char *str;
str = malloc(sizeof(char)*15);
printf("%p\n", (void*)str);
str = "Batman";                // str now points to a different location
printf("%p\n", (void*)str);

Используйте strcpy вместо:

str = malloc(sizeof(char)*15);
strcpy(str, "Batman");

ЗАМЕЧАНИЕ: Вы слишком мало выделяете памяти для объединения "Бэтмена" и "& Супермена". Первый - 6 символов, второй - 9 символов, поэтому вам нужно 6 + 9 + 1 = 16 символов. Последний +1 предназначен для хранения символа завершения строки, то есть \0. Поэтому, кроме использования strcpy, вам также необходимо выделить 16 символов.

Кстати:

  • Вам не нужно передавать адрес str в Функция как функция никогда не выполняет никаких назначений, таких как *s1 = ... something... Просто передайте str

  • sizeof(char) всегда 1, поэтому вам не нужно писать это.

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