有关堆与堆栈的讨论,请参阅此堆栈溢出问题:堆栈和堆是什么以及在哪里。
sizeof()
在堆元素上,如指针,将返回指针的大小,而不是指针可以存储的元素数。
但是,sizeof()
在堆栈元素上:数组或const char *
将返回数组或字符串的长度。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LENGTH 100
int main(int argc, char *argv[])
{
char *a = NULL;
char b[10] = "abcdefghi";
printf("sizeof(b): %zu\n", sizeof(b));
a = malloc(LENGTH + 1);
if (a) {
*(a + LENGTH) = '\0';
memset(a, ' ', LENGTH);
fprintf(stdout, "a (before memcpy):\t[%s]\n", a);
printf("sizeof(a), before: %zu\n", sizeof(a));
memcpy(a, b, sizeof(b) - 1);
fprintf(stdout, "a (after memcpy):\t[%s]\n", a);
printf("sizeof(a), after: %zu\n", sizeof(a));
free(a);
}
return EXIT_SUCCESS;
}
编译:
$ gcc -Wall sizeofTest.c -o sizeofTest
输出:
$ ./sizeofTest
sizeof(b): 10
a (before memcpy): [ ]
sizeof(a), before: 8
a (after memcpy): [abcdefghi ]
sizeof(a), after: 8
在我的平台上,achar *
指向占用 8 个字节的内存地址。