2012-04-18 89 views
1

我想动态创建一个char数组。然而,不管我把它放在哪个数字作为size数组的期望值,它只是继续使用4的大小。如果我把3,2甚至8,10也不会改变......动态字符数组,大小固定?

部分,我将其初始化...

char *x; 

x = (char *)calloc(10, sizeof(char)); 

if(x == NULL) 
{ 
    return; 
} 

cout <<"Size_Vector = "<<sizeof(x)<<endl; //Keep making the size of the array 4..no matter what 
+10

cout在C中不存在。 – 2012-04-18 04:40:10

回答

2

sizeof(x)返回指针的大小而不是分配的内存或数组的大小。

它总是返回4您的环境指针的大小为4,它对所有人都是一样的。

你将不得不跟踪你自己分配了多少内存&也确保你不会超出分配内存的范围。

+0

如果我想创建数组大小2,那么怎么办?我如何改变calloc中的sizeof(char)呢? – SpcCode 2012-04-18 04:35:38

+1

@SpcCode:'x =(char *)calloc(2,sizeof(char));''给你2 char的内存分配。 – 2012-04-18 04:38:13

+0

哦,明白了......编译器崩溃了,因为我是这样打印的:for(i = 0; i SpcCode 2012-04-18 04:44:25

2

xchar *类型的指针。 sizeof(x)返回指针的大小而不是数组大小。

通常,由于array decaying,无法从指针类型知道数组大小,即使它指向数组。

char *x = malloc(sizeof(char)*10); 
// This will give you 4 
printf ("%d\n", sizeof(x)); 

但是你可以得到一个数组类型的大小。

char x[10]; 
// This will give you 10 
printf ("%d\n", sizeof(x)); 
0

malloc调用返回一个void指针,当你说sizeof(指针)时,你要求指针的大小,而不是你刚刚声明的内存块。所以它给你4/8/...字节取决于你使用的m/c。

试试这个:

char * cptr;

int * iptr; (“整数指针的大小是:%d \ n”,sizeof(iptr)); printf(“字符指针的大小是:%d \ n”,sizeof(cptr));

注意:malloc指向您通过调用它动态获取的内存块的第一个元素(即10 * 1 = 10个字节)的地址。

+0

指针并不总是4个字节。在64位系统上,它们是8.在不寻常的系统上,它们可以是任意大小。 – 2012-04-18 05:16:24

+0

对不起,我在这里指的是32位m/c。 – Phoenix225 2012-04-18 05:22:26

+0

但在任何情况下调用calloc或malloc都会返回一个void指针,而当您执行sizeof(指针)时,您将始终获取可能为4/8/...的大小或取决于m/c的大小 – Phoenix225 2012-04-18 05:24:18

0

这是我为你写的一小段代码,如果你真的想通过调用calloc找到你保留的内存块的大小,虽然它明显地说,当你说10个空格的每个1字节然后你要去获得10个字节喜欢这里的情况下,它说你要10 *的sizeof(字符):

包括

包括

的main(){

char *ptr = NULL; 

    int i = 0; 

    int size = 0; 

    int n = 0; 

    printf("Enter the size of the dynamic array in bytes : "); 

    scanf("%d",&n); 

    ptr = (char*) calloc (n,sizeof(char)); 

    for(i=0;i<n;i++){ 

      size = size + sizeof(ptr[i]); 

    } 

    printf("Size is %d\n",size); 

}

+0

谢谢你真棒! – SpcCode 2012-04-18 06:43:15