我正在使用以下代码测试在C / C ++中使用sizeof运算符:
#include <ctype.h> /* Character types */
#include <stdio.h> /* Standard buffered input/output */
#include <stdlib.h> /* Standard library functions */
#include <string.h> /* String operations */
#include <sys/types.h> /* Data types */
#include <sys/wait.h> /* Declarations for waiting */
#include <unistd.h>
void main()
{
char a[100];
char *des = malloc(100*sizeof(char));
strcpy(des,"abcded\0");
printf("%d\n",sizeof(des));
printf("%d\n",sizeof(a));
free(des);
}
为什么这个程序输出:
4
100
相反:
100
100
答案 0 :(得分:4)
因为,尽管很多人都断言,但指针和数组在C&amp; C中并不是100%可互换的。 C ++。这是其中一个差异的明显例子。
指针的大小是4个字节(或任何平台特定的大小),无论它指向多少分配的内存。
数组的大小是数组的大小。
答案 1 :(得分:3)
sizeof(des)
返回指针的大小 - 系统上为4。它不会返回它指向的已分配空间的大小。
答案 2 :(得分:0)
因为它返回指针 des 的大小,指向分配的内存。
答案 3 :(得分:0)
printf("%d\n",sizeof(des));
printf("%d\n",sizeof(a));
等同于以下内容:
printf("%d\n",sizeof(char*)); //prints size of a pointer
printf("%d\n",sizeof(char[100])); //size of a char array of size 100
换句话说,sizeof
是一个运算符,它在传递给它的表达式的类型上运行。因此,当您编写sizeof(des)
时,表达式的类型为char*
,因此它会在您的系统上打印sizeof(char*)
4
。但是在sizeof(a)
的情况下,表达式的类型为char[100]
,因此它会打印sizeof(char[100])
100
。
这里讨论sizeof
更有趣的案例:
答案 4 :(得分:0)
sizeof
运算符产生no。类型的字节数。
sizeof des
给出100,因为des
的类型是char[100]
,char总是占用1个字节,其中有100个。
sizeof a
给出4,因为a
的类型是char*
,并且char指针在您的平台上占用4个字节(这在32位平台上是典型的。)
因此,sizeof只适用于它的操作数类型(注意,sizeof是一个运算符,它不是函数/宏)。 sizeof不与malloc交互,a
指向100个动态分配字节的开头的事实是无关紧要的。
答案 5 :(得分:0)
我将详细阐述abelenky的评论。您是否期望这两个typedef产生等效类型?
typedef char *string;
typedef char string[100];
这两个怎么样?
typedef struct { char *s; ... } header_t;
typedef struct { char s[100]; ... } header_t;
在这两种情况下,你的答案显然都是否定的。是的,您可以编译des=a
,因为a
会生成一个指针,但a
实际上是一个数组。
特别是,你也知道这最后一个typedef没有为指针保留内存。因此,a
大致类型为char * const
,这意味着a
是指向非常量字符的常量指针,因此a=des
会出现类型错误。我不知道如果说错误消息会抱怨数组,const
或左值。
答案 6 :(得分:0)
答案很简单。
des的类型是“char *”或字符的地址。因此,使用sizeof询问编译器的问题是“存储字符地址需要多少内存(以字节为单位)?”编译器响应4,因为您的程序和编译器具有32位(4字节)寻址。当你在一个数组上使用sizeof时,你会问一个不同的问题:“我需要多少内存(以字节为单位)来存储100个项目的字符数组?”这里的答案是100项* 1字节= 100字节。