我正在尝试编写一个将基数为10的整数转换为二进制数的函数。
我正在构建这样的函数:
void dec2bin(int dec, char * bin);
该函数将通过参数中的指针存储二进制结果。它传递一个在其他地方声明的变量,如下所示:
char *r1 = (char *)malloc(24);
该函数必须做的第一件事是用全零填充“24位结果”。它现在很好用,因为我根据我知道“大小”编码它,但我无法弄清楚如何确定任意“r1”的“大小”。我能想到使用sizeof函数的每一种方式都不会给我24。
我很困惑,并没有连接char,char *等各自大小之间的关系,以及我如何使用这些大小来获得我正在寻找的关于“r1”的内容。< / p>
有人会介意给我一个指针吗?双关语。
谢谢!
答案 0 :(得分:4)
您可以将大小作为另一个参数传递:
void dec2bin(int dec, char * bin, size_t max_chars);
答案 1 :(得分:3)
我无法弄清楚如何确定任意“r1”的“大小”。
您不能这样做:在通话结束后,您传递给malloc
的尺寸信息会不可逆转地丢失。你所拥有的就是指向至少24字节内存块的指针。如果您需要大小,则需要将其存储在其他位置 - 例如,在随身携带的单独变量中。
此问题的两个典型解决方法包括:(1)在分配的空间中存储以零结尾的字符串,并使用该字符串的长度作为分配的块的大小的代理,以及(2)定义您的包含大小和分配指针的自有结构。这两种解决方案都不理想,但至少可以选择。
答案 2 :(得分:1)
r1
的类型是char *(字符指针),因此,与所有指针一样,它的大小为4(或8,具体取决于您的情况)。无论你分配给它的内存块的大小。
您无法从指针中检索已分配块的大小,因此如果您稍后需要该大小,则必须记住yoursef的大小(例如,将其存储在不同的变量中)。
答案 3 :(得分:1)
r1
是指针类型的变量,其大小是固定的并且始终相同(就像给定类型的任何变量的大小一样) ),不大于(通常等于)sizeof(void *)
。您真正想知道的是位于*r1
的数组的大小(注意星号),这是您无法知道的。你必须自己跟踪它,通常是这样的:
size_t const n = get_some_number();
foo * p = calloc(n, sizeof(foo));
现在您使用对(p
,n
)来描述动态数组。
(请注意,C99和C11具有可变长度数组的概念,在其上下文sizeof
实际上(有时)确实给出了实际的数组大小,但这有点阴暗的事情,无论如何,这不是你要求的。)
答案 4 :(得分:1)
当你分配内存时,你会得到一个指针,它有一个固定的大小,所以无法用sizeof来获得分配内存的大小。
答案 5 :(得分:1)
正如其他人所说,如果它只是一个指针,你将无法告诉任何东西(除非它是零终止的,在这种情况下你可以迭代直到你点击一个等于零的元素(不是字符') 0' ))。
但是,如果按如下方式进行设置,实际上可以在调用sizeof()
之后查看缓冲区大小...至少直到将其发送到函数,其中数组衰减为{{1}指针。
char*