c - 指向指针 malloc 和操作的指针

标签 c pointers malloc

#include <stdio.h>
#include <stdlib.h>


int main(int argc, char * argv[])
{
    char *p[2];
    char **pp = calloc(2, 4);

    p[0] = "ab";
    p[1] = "cd";
//  p[2] = "ef";

    pp[0] = "ab";
    pp[1] = "cd";
    pp[2] = "ef";

    printf("pp: %s, %s, %s\n", pp[0], pp[1], pp[2]);
    printf("size_p: %d\nsize_pp: %d\n", sizeof p, sizeof pp);
}

如果 'p[2]' 被定义并赋值 - 结果行为是一个段错误。如果分配了“pp[2]”——输出如下:“ab、cd、ef”。 “sizeof”为“p”返回 8(每个指针 2x4 字节),为“pp”返回 4 个字节。为什么我能够分配“pp[2]”,即使它应该只拥有 8 个字节的已分配内存(应该只能存储 2 个指针地址)?另外,“sizeof”如何确定这两种情况下的实际内存大小?

最佳答案

p 被声明为具有两个元素,因此 p[2] 不存在 - 因此出现段错误。由于 p 是一个局部数组(指针),sizeof(p) 给出元素类型的大小(元素类型是 char *,其大小为 4) 乘以元素数 (2)。另一方面,pp 是一个指针(指向指针),而不是数组,因此 sizeof(p) 只是一个 char * 的大小*,它与 32 位机器上任何其他指针的大小相同,即 4。对 pp[2] 的赋值似乎成功纯属偶然——你'正在分配的内存之外写入(它只包含两个 char * 元素的空间)。

顺便说一句,指向字符串文字的指针应该是const char *

关于c - 指向指针 malloc 和操作的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6383903/

相关文章:

通过 malloc 和 getchar() 创建字符串

c++ - 通过一次调用 new 运算符来批量分配对象?

C指针(数组)内存分配(十六进制)

c - 文件读写模式 "r+"C 中的意外行为

c - 指针如何访问结构体的数据成员

c - C语言如何重写一个函数(系统调用)?

c - 运算符有什么用!!在C?

c++ - C/C++ : Pointer on Pointer on structure

c++ - malloc 和 calloc 与 std::string 的区别

c - 使用多维数组传输缓冲区