Верно ли возвращать const char *
из функции, когда реальный возвращаемый буфер не является константным массивом?
Например, в этом минимальном примере ниже, buffer
не является константой char *
, но затем возвращается как const char *
.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const char *str_alloc(const char *str, size_t n)
{
char *buffer;
if ((buffer = malloc(n)) != NULL) {
memcpy(buffer, str, n);
}
return buffer;
}
int main()
{
const char *str = str_alloc("hello", 6);
if (str == NULL) {
fprintf(stderr, "memory allocation error\n");
return EXIT_FAILURE;
}
printf("str: %s\n", str);
// str[0] = 'H'; // error: read-only variable is not assignable
free((void *) str);
return 0;
}
. В приведенном выше примере возвращение неконстантного char *buffer
как const char *
помогает мне добиться того, чтобы вызывающая сторона не могла изменить содержимое буфер без явного приведения типа. Но я хотел бы знать, является ли это четко определенным кодом или этот код вызывает неопределенное поведение из-за обработки char *
как const char *
?