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;
}
在上面的示例中,返回一个非constchar *buffer
可以const char *
帮助我强制调用者在没有显式类型强制转换的情况下不能修改缓冲区的内容。但是我想知道这是否是定义良好的代码,或者由于被char *
视为const char *
?而导致该代码调用未定义的行为?
这是定义良好的代码,因为您限制了该值的使用可能性。俗话说“谁可以做更多,可以做更少”。相反的将是无效的,并且需要显式强制转换。
但是您的代码有问题。将字符串的大小作为参数传递是不安全的。在您的示例中,您不会在分配的缓冲区中复制“ \ 0”。结果,该字符串未正确终止。程序的行为是不确定的,并且可能以分段错误结尾,因为这printf
会尝试访问缓冲区末尾之外的数据。
最好在str_alloc
函数中确定字符串的长度。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句