繁体   English   中英

在代码块中使用malloc显示错误的已分配内存大小值

[英]showing wrong value of allocated memory size using malloc in codeblocks

分配的内存大小

int main() {

    char *aPtr[10];

    aPtr[0] = (char *)malloc(20 * sizeof(char));

    aPtr[0] = "This is a test";

    aPtr[1] = (char *)malloc(20 * sizeof(char));

    aPtr[1] = "This is a test2";

    printf("%s\n%s\n", aPtr[0], aPtr[1]);

    printf("%d", sizeof(aPtr[0]));
}

在这种情况下,为什么aPtr[0]的大小显示4个字节而不显示20个字节。 我不明白为什么会这样。

aPtr是一个指向char的指针数组 因此, aPtr每个元素都是指向charchar *的单个指针。 特别地, aPtr[0]char * 因此, sizeof(aPtr[0])为您提供了该指针的大小。 在许多机器上(在“ 32位机器”上),指针的大小是32位或4个字节。

根据您的问题,听起来您对指针指向的数据大小感兴趣。 那是完全不同的。 (再次,仔细了解我们在指针指向数据之间的区别。)在这种情况下,找到指向数据的大小可能很棘手,事实证明,这可能不涉及的sizeof运算符。

如果要找出由malloc分配的内存块的大小,事实证明,没有可移植的方法可以做到这一点。 也就是说,在您说p = malloc(20) ,就无法再问“嘿, malloc 。您给我的那个指针,我要您为其分配一些内存,请问我要分配多少内存,再次? 我忘了。” 如果你需要知道你的malloc分配指针多少内存指向, 必须以某种方式记住它。

另一方面,如果您想找出一个字符串有多长,那就很简单:只需调用strlen 例如,对您的程序进行合理的修复是使最后一行成为

printf("%d", strlen(aPtr[0]));

实际上,由于strlen (如sizeof )返回一个特殊的类型,称为size_t ,该类型可能比int更大,因此编写此类型的更简便的方法是

printf("%zu", strlen(aPtr[0]));

要么

printf("%d", (int)strlen(aPtr[0]));

但是回到您的原始程序,我们应该谈论另一个误解。 你说

aPtr[0] = (char *)malloc(20*sizeof(char));
aPtr[0] = "This is a test";

现在,我知道您已经知道内存分配很重要,这是事实,但是在这种情况下,事实证明您要分配20字节的内存,然后将其丢弃。 仔细观察: malloc返回一个指针值(指向新分配的内存),然后将其分配给aPtr[0] (将值存储在其中)。 但是,在接下来的一行中,您将aPtr[0]分配给另一个指针,指向静态分配的字符串"This is a test" 先前的值(由malloc返回的值)将丢失。

您可能想在这里写的是

aPtr[0] = malloc(20);
strcpy(aPtr[0], "This is a test");

现在,我们使用该字符串常量"This is a test"来做完全不同的事情。 我们不是简单地为其分配指针,而是将while字符串(实际上是库函数strcpy正在复制整个字符串)逐字节复制到aPtr[0]所指向的指针中,也就是说,刚从malloc回来。 (在这个最新示例中,我还将malloc的返回值的不必要的转换丢弃到(char *) ,并将不必要的乘以sizeof(char *)乘法。)

请注意,在这种情况下(现在您实际上是在使用malloc的内存),malloc的内存大小很重要。 如果你说过

aPtr[0] = malloc(10);
strcpy(aPtr[0], "This is a test");

那么你会有一个大问题。

最后,对这个问题还有另一个答案:“字符串有多大?”,尽管它通常并不太有用,但在这种情况下肯定没有用。 但是如果你愿意,你可以写

printf("%zu\n", sizeof("This is a test"));

并显示15。(它比您想像的字符串长度多打印一倍,因为字符串常量的大小计数包括结尾的\\0字符。)

您有一个char指针数组。 因此,指针的大小和所指向的大小是不同的。 在这里,您将打印固定大小的指针的大小,即对于32位计算机,它的大小为4个字节。

为什么aPtr [0]的大小显示4个字节而不是显示20个字节。

文档

sizeof运算符产生其操作数的大小(以字节为单位),该操作数可以是表达式或类型的括号名称。 大小由操作数的类型确定。

在您的情况下, aPtr[0]char的指针。 您环境中的指针类型似乎为4字节宽

在C语言中,没有任何可移植的方式可以从指针中得出指针所指向的有效内存的大小。 另请参见以下答案: 确定C中动态分配的内存的大小

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM