Ошибка сегментации - указатель на символ - PullRequest
6 голосов
/ 03 июня 2009

В приведенном ниже коде строка:

*end = *front;

дает ошибку сегментации. Я задал похожий вопрос здесь , но я не уверен, что это потому, что у меня есть две копии num. Пожалуйста, объясните, почему это ошибка. Спасибо.

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

char* getPalin(char* num);

int main()
{
    char* num = (char*)malloc(100);

    num = "123456";

    printf("%s\n", getPalin(num) );

    return 0;
}

char* getPalin(char* num)
{
    int length = strlen(num);

    if ( length % 2 == 0 )
    {
        char* front = num;
        char* end = num + strlen(num) - 1;  //pointer to end

        while( front != num + (length/2) )  //pointers not middle yet
        {
            *end = *front;

            printf("%c", *end);

            front++;
            end--;
        }
    }

    return num;
}

Ответы [ 4 ]

17 голосов
/ 03 июня 2009

Эти две строки:

char* num = (char*)malloc(100);
num = "123456";

имеют следующий эффект.

Первый выделяет 100 байтов и устанавливает num для указания на эти байты.

Вторая меняет число на указатель на строку «123456», которая почти наверняка находится в постоянной памяти.

Любая попытка изменить содержимое постоянной памяти приведет к нарушению сегментации. Вам нужно скопировать строку в malloc 'd num, прежде чем пытаться ее изменить, с помощью:

strcpy (num, "123456");

У вас должна быть строка, в которой вы сейчас находитесь:

num = "123456";
4 голосов
/ 03 июня 2009

Используйте

strncpy(num, "123456", 100);

вместо

num = "123456";
1 голос
/ 03 июня 2009

Согласно ответу Константина.

Вы уже выделили память для num с помощью инструкции malloc.

Если бы не было, вы могли бы сойти с рук:

char* num = "123456";

Который будет определять и распределять память на лету, но, скорее всего, он будет выделяться как константа и, следовательно, только для чтения.

Использование strncpy вместо strcpy для копирования «123456» гарантирует, что любой дополнительный пробел за пределами конца строки нулевым терминатором также будет инициализирован нулем, если вы укажете n как 100 (для вашего примера). В противном случае, не инициализируя память, выделенную malloc для нуля (memset (num, 0, 100)), тогда вполне возможно, что вы могли бы выйти за пределы конца строки.

О, почти забыл. Рекомендуется использовать strcpy_s или strncpy_s, так как они более безопасны, хотя для вашего кода это не имеет значения.

0 голосов
/ 14 октября 2012

Причина ошибки:

  char* num = (char*)malloc(100);

В этой строке вы объявили num как указатель на массив или указатель на его первый элемент, а не как строку.

 num = "123456";

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

   char num[100];
   strcpy(num,"123456"); //Even if you use num="123456"; here it would still be wrong

OR

  char* num = (char*)malloc(100);
  strcpy(num,"123456");

OR

  char num[100]={'1','2','3','4','5','6'};

Любой из них сделает вашу работу.

...