Выделение памяти на язык char* C

это правильный способ выделения памяти char*.

char* sides ="5";

char* tempSides;

tempSides = (char*)malloc(strlen(inSides) * sizeof(char));

7 ответов


почти. Строки заканчиваются NULL, поэтому вы, вероятно, хотите выделить дополнительный байт для хранения нулевого байта. То есть, хотя sides имеет длину 1 символ, это действительно 2 байта: {5,''}.

так это будет выглядеть так:

tempSides = (char *)malloc((strlen(sides)+1)*sizeof(char));

и если вы хотите скопировать его в:

strcpy(tempSides, sides);

внимание:

  1. строки имеют нулевое завершение (\0), и strlen () не считает его;
  2. по определению, sizeof (char) равен 1 (байт), поэтому это не требуется;
  3. если вы используете компилятор C (не c++), нет необходимости бросать его в char *;

так что это будет:

char *tempSides = malloc(strlen(inSides) + 1);

тем не менее, если вы хотите дублировать содержание inSides, вы можете использовать strdup, например:

char *tempSides = strdup(inSides);
if (tempSides != NULL) {
    // do whatever you want...
    free(tempSides);
}

как было указано, вы пропустили выделение места для завершающего нулевого chararacter. Но я также хотел бы отметить пару других вещей, которые могут сделать ваш код более кратким.

по определению sizeof(char) всегда 1, поэтому вы можете сократить строку распределения до:

tempSides = (char*)malloc(strlen(inSides) + 1);

другое дело, что это похоже на то, что вы делаете, чтобы дублировать строку. Есть встроенная функция, которая делает это для вас:

tempSides = strdup(inSides);

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


с этим есть проблема. tempSides укажет на неинициализированный блок памяти размера 1. Если вы собираетесь скопировать строку сторон в tempSides, вам нужно будет выделить размер на один байт больше, чтобы удерживать нулевой Терминатор для строки. Значение, возвращаемое strlen (), не включает нулевой Терминатор в конце строки.


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

кроме того, вы вообще должны не бросьте возвращение из malloc. Он может скрыть ошибку, где вы забыли #include правильный заголовок. Умножение на sizeof(char) также бессмысленно, так как стандарты (как C, так и c++) определяют sizeof(char) всегда быть 1.

наконец, каждый вызов malloc должен включать тест результата. Я бы завернул все дело в функции:

char *dupe_string(char const *string) { 
    char *temp;
    if (NULL!=(temp=malloc(strlen(string)+1)))
        strcpy(temp, string);
    return temp;
}

умножение количества элементов на sizeof(char) это вопрос личных предпочтений, поскольку sizeof(char) всегда равен 1. Однако если вы делаете это для согласованности, лучше использовать тип указателя получателя для определения размера элемента вместо явного указания типа. И не бросайте результат malloc

tempSides = malloc(strlen(inSides) * sizeof *tempSides);

конечно, при работе с нулевыми строками вы должны помнить, чтобы выделить дополнительное пространство для завершающего нулевого символа. Невозможно сказать, так ли это. является ли ваше намерение сделать tempSides строка с нулевым концом в этом случае, поэтому я не могу сказать, нужна ли она вам.


правильный способ выделения динамической памяти tempSides как показано ниже:

char* sides ="5";
char* tempSides;
tempSides = (char*)malloc((strlen(sides) + 1) * sizeof(char));

char* хранит строковые данные, похожие на char[]. Строкиnull () прекращено. Таким образом, дополнительный один байт должен быть выделен для null персонаж хранения.

динамически выделенный блок памяти должен быть освобожден с помощью free() после того, как его использование закончилось. Если не освободить, произойдет утечка памяти.

free(tempSides);

один память освобождается,NULL должно быть назначено чтобы он не был болтающимся указателем.

tempSides = NULL;