sizeof(...)
ожидает постоянного выражения времени компиляции. strlen
- это не выражение времени компиляции, это функция, которую нужно выполнить, чтобы получить результат. Следовательно, компилятор не может зарезервировать достаточное хранилище для массива, объявленного так:
char c[strlen("Hello")];
Хотя длина строки явно равна 5, компилятор не знает.
Чтобы избежать этой ловушки, не используйте sizeof
здесь. Вместо этого:
char* c = (char*)malloc(strlen(name)+strlen(rname)+1);
Это дает вам указатель на n байтов в ответ. sizeof(char)==1
всегда верно, поэтому число байтов в буфере равно количеству символов, которые вы можете сохранить в нем. Для malloc
массивов другого типа, умножьте на статический размер одного элемента массива:
int* c = (int*) malloc(sizeof(int)*100);
Это нормально, потому что sizeof
применяется к выражению времени компиляции. Конечно, путь C ++ намного чище:
int* c = new int[100];