Неожиданный результат при присвоении значения массиву символов при динамическом выделении памяти c - PullRequest
0 голосов
/ 30 марта 2020

Следующая программа показывает неожиданный результат

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

int main()
{
    char* num1;
    num1 = malloc(100*sizeof(char));
    num1 = "38462879";
    printf("%s\n",num1);
    num1[0]='5';
    printf("%s\n",num1);
    return 0;
}

Я ожидаю, что она напечатает данную строку, а затем напечатает данную строку с заменой первой буквы на 5 вместо 3 на следующей строке.

Но он печатает заданную строку в первой строке, а затем программа не запускается.

Не могли бы вы помочь ??

Ответы [ 3 ]

1 голос
/ 30 марта 2020

Говоря

 num1 = "38462879";

вы, по сути,

  • Перезаписываете выделенный указатель на память (утечка памяти)
  • Делая num1 указанием на строковый литерал . (запрещено пытаться изменить содержимое)

Позже ваша попытка изменить часть этого литерала вызовет неопределенное поведение . Вместо этого вам нужно использовать strcpy(), например

 strcpy (num1, "38462879");

При этом пара общих предложений:

  • для размещенной среды, int main() должно быть как минимум int main(void).
  • Вы должны всегда проверять успешность вызова функции (особенно библиотечные функции) перед использованием возвращенного значения.
  • в C, sizeof(char) определяется как быть 1, это избыточный множитель.
0 голосов
/ 30 марта 2020

это символ, вы не можете выделить память для одного символа и сохранить в нем строку, в нем есть место только для одного символа. Я думаю, что вы имели в виду char *num1.

0 голосов
/ 30 марта 2020

Не назначайте постоянную строку для num1, но используйте strcpy (): strcpy (num1, "what");

...