void 指针可以存储比其动态分配大小更大的数组吗?

Sha*_*hin 0 c

我还在C的学习阶段,写了下面的函数。我没想到它会起作用,因为 void 指针只给出了 2 个字节,这对于我的 23 字节字符数组来说是不够的。尽管它存储在 char 数组中,并且可以将其类型转换为另一个指针变量。

void main(){
     void *p = malloc(2 * sizeof(char));
     p = "Unites State of America";
     printf("%p length -> %ld, sizeof -> %ld\n", p, strlen(p), sizeof(p)/sizeof(p[0]));

     char *pstr = (char*) p;
     printf("%s length -> %ld\n", pstr, strlen(pstr));
}
Run Code Online (Sandbox Code Playgroud)

结果:

0x55600dccd008 length -> 23, sizeof -> 8
Unites State of America length -> 23
Run Code Online (Sandbox Code Playgroud)

我的 void 指针是如何超过我最初请求的大小的?

Apl*_*123 5

您分配了 2 个字符的内存,所以现在堆中有一小块内存等待数据存储在那里。但是,您然后重新分配p指向"Unites State of America"存储在别处的字符串。p = "string"不会将字符串移动到由 指向的内存中p,而是p指向该字符串。