Замена символа в массиве и выделение памяти под массив
Почему не работает 5 строка, и почему работает 8 строка, если не выделена память под B?
#include <stdlib.h>
int main() {
char* A = (char*)malloc(10*sizeof(char));
A = "123\0";
A[0] = '1'; //5 строка
char* B;
B = "123456789123456789123456789123456789123456789123456789\0"; // 8 строка
return 0;
}
Ответы (2 шт):
Почему не работает
Что значит "не работает"?! Вы должны были описать ожидаемое и получаемое поведение. Телепатов здесь нет - улавливать Ваши мысли некому.
Подозреваю, что Вы просто не понимаете как это работает. На самом деле, в языке С/С++ запись лексемы вида "это строка" означает инструкцию компилятору выделить 11 байт памяти, в первые 10 поместить текст, заданный в кавычках, а в последнюю - ноль символ. Вот и всё...
Кстати говоря, добавлять явно ноль-символ '\0' в конец текстовой константы не нужно - компилятор это и сам сделает.
Оператор вида
char *cptr;
инструктирует компилятор выделить 4 байта под переменную, которая является указателем на строку. Поэтому, когда Вы пишите
A = "123\0";
то это означает, что указатель, лежащий в переменной А теперь указывает на строку "123\0" а предшествующее присвоение
A = (char*)malloc(10*sizeof(char));
соответственно, теряет всякий смысл т.к. нигде не используется.
Именно поэтому, ваше утверждение о том, что не работает, оно тоже - не очень понятно...
Вы не указали, что значит "не работает", будем догадываться...
Вероятно, вы компилируете ваш код как С++ (а С и С++ - разные языки) - в этом случае он не будет компилироваться, так как строковый литерал рассматривается как const char [] - т.е. константный, неизменный массив символов. И поэтому его нельзя присваивать переменной char* - потому что так легко нарушить константность, присваивая что-то через этот указатель.
В пользу того, что вы компилируете как С++, есть косвенная улика - приведение (char*) при malloc - при компиляции в режиме C оно не нужно.
Содержимое строк в С/С++ вот так
A = "123\0";
не копируется, см. функции типа strcpy.
Вот ваш код, скомпилированный как код C - https://ideone.com/MC0zuQ.
Что до работы - под которой обычно программисты понимают время выполнения - то тут просто ничего не делается, так что умный оптимизатор может просто вообще выкинуть весь код :)