Как выделить строку, используя mallo c и reallo c, используя C - PullRequest
0 голосов
/ 12 апреля 2020

Я пытаюсь (1) инициализировать массив символов и (2) изменить размер массива каждый раз, когда он читает строку. Однако всякий раз, когда я пытаюсь скомпилировать, я вижу сообщение: error: initializer element is not constant. char *ptr = malloc(1 * sizeof(*ptr));

Я не понимаю, что не так с моими кодами. Я пробовал оба (1) char *ptr = (char*) malloc(ptr * sizeof(char)) и (2) char *ptr = malloc(1 * sizeof(*ptr)), но ни один из них не работал.

Вот мои полные коды:

// char *ptr = (char*) malloc(ptr * sizeof(char));
char *ptr = malloc(1 * sizeof(*ptr));

void execute(char *splitInput)
{
  char myhistory[] = "myhistory";
  int string_length = strlen(splitInput);

  char *new_ptr = realloc(ptr, sizeof(char) * string_length);
 }

Ответы [ 2 ]

0 голосов
/ 12 апреля 2020
char *ptr = (char*) malloc(ptr * sizeof(char));
char *ptr = malloc(1 * sizeof(*ptr));

В C Запрещено выполнять код, такой как код в функциях, подобных malloc(), вне какой-либо другой функции. Таким образом, эти операторы никогда не будут работать независимо от того, как вы их переставляете.

Вам необходимо объявить указатель в глобальной области видимости и выполнить присвоение указателю, возвращаемому malloc() внутри любой функции:

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

char *ptr;                              // declare ptr as pointer with global scope.

void execute(char *splitInput)
{
  //char myhistory[] = "myhistory";
  int string_length = strlen(splitInput);

  char *new_ptr = realloc(ptr, sizeof(char) * string_length);

  strcpy(ptr,splitInput);
}

int main()
{
   char s[] = "Hello World!";

   ptr = malloc(1 * sizeof(*ptr));       // assign ptr to point to the memory 
                                         // allocated by malloc. 
   execute(s);   
}

Обратите внимание, что myhistory не используется внутри функции execute().

0 голосов
/ 12 апреля 2020

Проблема с декларацией char *ptr = malloc(1 * sizeof(*ptr));. C не разрешает код там, только stati c объявлений. То есть:

char *ptr = "Foo bar baz.";

нормально, потому что он присваивает строку c. Нет кода для выполнения.

Будет работать следующее:

char *ptr;

int main(int argc, char *argv[]) {
  // char *ptr = (char*) malloc(ptr * sizeof(char));
  ptr = malloc(1 * sizeof(*ptr));
}

void execute(char *splitInput)
{
  char myhistory[] = "myhistory";
  int string_length = strlen(splitInput);

  char *new_ptr = realloc(ptr, sizeof(char) * string_length);
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...