我们可以为char *分配内存,但是将其作为const char *返回吗?

孤独的学习者

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 *而导致该代码调用未定义的行为

ike

这是定义良好的代码,因为您限制了该值的使用可能性。俗话说“谁可以做更多,可以做更少”。相反的将是无效的,并且需要显式强制转换。

但是您的代码有问题。将字符串的大小作为参数传递是不安全的。在您的示例中,您不会在分配的缓冲区中复制“ \ 0”。结果,该字符串未正确终止。程序的行为是不确定的,并且可能以分段错误结尾,因为这printf会尝试访问缓冲区末尾之外的数据。

最好在str_alloc函数中确定字符串的长度

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我们可以将const char *分配给cpp中的字符串吗?

来自分类Dev

我们如何分配内存以返回char **

来自分类Dev

为什么我们可以从函数返回char *?

来自分类Dev

我们可以为数组分配更长的字符串吗?

来自分类Dev

为什么我们可以将整数分配给 char 变量

来自分类Dev

const char *返回类型

来自分类Dev

我可以将const char *数组传递给execv吗?

来自分类Dev

我们可以为WCF做URL重写吗

来自分类Dev

我们可以为WrappedArrow定义Monad实例吗?

来自分类Dev

我们可以为 Chrome 安装 Firebug 吗?

来自分类Dev

我们可以为函数赋值吗?

来自分类Dev

可以使用char []作为参数,返回值等性能问题吗?

来自分类Dev

可以更改const char *变量吗?

来自分类Dev

如果我们改变char * ptr =,指针指向的地址会改变吗?

来自分类Dev

SWIG,我可以为从Java传递给C的char **赋值吗

来自分类Dev

我们可以访问已释放的内存吗?

来自分类Dev

我们可以清除 Ubuntu 中的内存缓存吗

来自分类Dev

我们可以潜入RAM分配信息吗

来自分类Dev

我们可以在React中的const内部样式吗

来自分类Dev

我们可以在各处使用const而不是let吗?

来自分类Dev

我们可以将函数作为参数传递吗

来自分类Dev

我们可以使用类作为标题吗

来自分类Dev

如果pvc处于“已发布”状态,我们可以将其分配给pv吗?

来自分类Dev

我们可以动态地为C中的静态变量分配内存吗?

来自分类Dev

我们可以对malloc分配的内存使用数组的表示法吗?

来自分类Dev

从文件中读取单词,并将其作为char指针返回

来自分类Dev

const_cast <char *>(char * const)不是左值吗?

来自分类Dev

(const char *)++或(const char)++?

来自分类Dev

将const char *作为参数传递时会自动删除吗?

Related 相关文章

  1. 1

    我们可以将const char *分配给cpp中的字符串吗?

  2. 2

    我们如何分配内存以返回char **

  3. 3

    为什么我们可以从函数返回char *?

  4. 4

    我们可以为数组分配更长的字符串吗?

  5. 5

    为什么我们可以将整数分配给 char 变量

  6. 6

    const char *返回类型

  7. 7

    我可以将const char *数组传递给execv吗?

  8. 8

    我们可以为WCF做URL重写吗

  9. 9

    我们可以为WrappedArrow定义Monad实例吗?

  10. 10

    我们可以为 Chrome 安装 Firebug 吗?

  11. 11

    我们可以为函数赋值吗?

  12. 12

    可以使用char []作为参数,返回值等性能问题吗?

  13. 13

    可以更改const char *变量吗?

  14. 14

    如果我们改变char * ptr =,指针指向的地址会改变吗?

  15. 15

    SWIG,我可以为从Java传递给C的char **赋值吗

  16. 16

    我们可以访问已释放的内存吗?

  17. 17

    我们可以清除 Ubuntu 中的内存缓存吗

  18. 18

    我们可以潜入RAM分配信息吗

  19. 19

    我们可以在React中的const内部样式吗

  20. 20

    我们可以在各处使用const而不是let吗?

  21. 21

    我们可以将函数作为参数传递吗

  22. 22

    我们可以使用类作为标题吗

  23. 23

    如果pvc处于“已发布”状态,我们可以将其分配给pv吗?

  24. 24

    我们可以动态地为C中的静态变量分配内存吗?

  25. 25

    我们可以对malloc分配的内存使用数组的表示法吗?

  26. 26

    从文件中读取单词,并将其作为char指针返回

  27. 27

    const_cast <char *>(char * const)不是左值吗?

  28. 28

    (const char *)++或(const char)++?

  29. 29

    将const char *作为参数传递时会自动删除吗?

热门标签

归档