2012-02-08 131 views
1

我正在尝试编写一个将基本10整数转换为二进制数的函数。与sizeof()函数的结果相混淆

我构造函数是这样的:

void dec2bin(int dec, char * bin); 

功能将通过在参数指针的手段二进制结果存储。

char *r1 = (char *)malloc(24); 

功能需要做的第一件事是填写了“24位的结果,”与所有零:它如下传递别处声明的变量。它现在很好用,因为我知道“尺寸”的基础上对它进行了编码,但我无法弄清楚如何确定任意“r1”的“尺寸”。我认为使用sizeof函数的每种方式都不会给我24.

我对此感到困惑,并没有连接char,char *等的各个大小之间的关系,以及如何使用这些关系大小来获得我正在寻找的关于“r1”的内容。

有人会介意给我一个指针吗?潘打算。

谢谢!

+0

答案很简单:你不能。 – 2012-02-08 19:42:59

+0

@FredLarson:我同意,你不能。而且,这不是双关。 :-( – Mithrandir 2012-02-08 19:44:26

+0

'malloc'返回一个指针,所以不需要施加'malloc'调用的返回值。 – 2012-02-08 19:45:00

回答

3

我不知道如何确定任意“r1”的“大小”。

你不能做到这一点:关于你传递给malloc调用之后不可逆转地失去了大小的信息。那时你所拥有的只是一个指向至少24字节内存块的指针。如果你需要这个大小,你需要将它存储在其他地方 - 例如,在你携带的一个单独的变量中。

解决此问题的两种典型解决方法包括(1)在分配的空间中存储零终止字符串,并使用该字符串的长度作为分配块大小的代理,以及(2)定义您自己的结构包含大小和分配的指针。这两种解决方案都不是理想的,但至少是你的选择。

1

r1的类型是一个char *(char指针),因此,像所有指针一样,其大小为4(或8,取决于您的情况)。不管你分配给它的内存块的大小。

无法从指针中检索分配块的大小,因此如果您稍后需要大小,则必须记住yoursef的大小(例如,通过将其存储在不同的变量中)。

1

r1指针类型的变量,其大小是固定的并且总是相同的(就像的尺寸的给定类型的任何变量),这是不大于(并且通常等于) sizeof(void *)。你真正想知道的是位于*r1(注意星号)的数组的大小,这是,你不知道。你要跟踪它自己,通常是这样的:

size_t const n = get_some_number(); 
foo * p = calloc(n, sizeof(foo)); 

现在使用pn)来描述你的动态数组。

(请注意,C99和C11有变长数组的概念,在其上下文sizeof不实际(有时)给你的实际数组的大小,但是这是一个有点阴暗的事情,在任何情况下,是不是你问什么。)

1

当您分配内存,你回来的指针,它有一个固定的大小,所以没有办法让与的sizeof分配的内存的大小。

4

你可能只是传递大小为另一个参数:

void dec2bin(int dec, char * bin, size_t max_chars); 
1

正如其他人所说,如果它只是一个指针,你将不能告诉任何东西(除非它是零终止,在这种你可以迭代直到你遇到一个等于零的元素(而不是字符'0'))。

不过,如果你将它设置如下,你可以看到的缓冲区大小调用sizeof()后......至少,直到你把它发送给一个函数,数组衰变为普通char*指针。

void test(char* s) 
{ 
    int i2 = sizeof(s)/sizeof(char); 
} 

char c1[] = "Testing!"; 
int i1 = sizeof(c1)/sizeof(char); // i1 is 9 (size of buffer) 
test(c1);        // i2 is 4 (size of pointer)