我希望下面的代码片段能够使用calloc为五个成员分配内存。
$ cat calloc.c
// C program to demonstrate the use of calloc()
// and malloc()
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *arr;
arr = (int *)calloc(5, sizeof(int));
printf("%x\n", *arr);
printf("%x\n", *(arr+1));
printf("%x\n", *(arr+2));
printf("%x\n", *(arr+3));
printf("%x\n", *(arr+4));
printf("%x\n", *(arr+5));
printf("%x\n", *(arr+6));
// Deallocates memory previously allocated by calloc() function
free(arr);
return(0);
}
但它似乎分配了五个以上;它分配了六个成员,为什么?
./a.out
0
0
0
0
0
0
411
它分配的内存未超过5。它已分配了5个成员,并用0对其进行了初始化。当您访问分配内存的外部时,它可能会被写入任何内容,而不一定是非零值。
首先,让我们弄清楚:就所有目的而言,*(a x)
与a[x]
是相同的。
C具有自由内存访问权限。如果您执行arr[1000],您仍然会打印一个值,或者程序将因分段错误而崩溃。这是未定义行为的典型情况。编译器无法知道您编写的代码是否错误,因此它无法抛出错误。相反,C标准称这是未定义行为。这意味着您正在访问不应该访问的内存。
作为程序员,您有责任检查您没有超出数组的边界,而不是编译器的边界。此外,calloc
用0初始化所有元素。你认为你为什么得到411?再次运行它,您可能会得到不同的值。您在a[5]
处访问的内存没有分配给数组。相反,您正在超出数组的边界。该内存很可能被分配给其他东西。如果它被分配给另一个程序,您在运行程序时会遇到分段错误。
分配内存不像买Lollipop。分配内存更像是购买土地。
如果你买了五个Lollipop,你试图吃第六个,这显然是行不通的——甚至谈论“试图吃第六个”也是非常荒谬的。
但是如果你买了一块10英尺乘50英尺的土地,你开始建造10英尺乘10英尺的建筑,在建造了其中的五栋之后(完全占据了你的土地),你建造了第六栋侵占了你邻居的土地,你的邻居可能不会马上注意到,所以你可能会逃脱惩罚。(无论如何,有一段时间。最终肯定会有麻烦。)
类似地,如果你分配一个大小为5的数组,然后尝试访问一个不存在的第6个元素,那么没有自然法则可以阻止它,就像你尝试吃不存在的第6个Lollipop一样。在C语言中,您通常不会收到关于越界数组访问的错误消息,因此您可能会得到似乎有效的代码,即使它正在做一些完全不可接受的事情,例如侵占邻居的土地。
我想在C++11中使用多线程来调用一个类成员函数在它自己的线程中。我已经能够让它与全局函数一起工作:
问题内容: 问题答案: 实习生池中只有一个字符串,每次您运行代码时都会重复使用。 然后是每次运行该行时都会构造的额外字符串。因此,例如: 将以11个字符串结尾,并在内存中包含“ abcd”内容-被插入的1个副本和10个副本。
在JDK8中,当我使用ParallelStream时会生成多少线程?例如,在代码中: 如果这个列表有100000个项目,那么会产生多少个线程? 另外,是每个线程都得到相同数量的项目来工作,还是随机分配?
calloc(配置内存空间) 相关函数 malloc,free,realloc,brk 表头文件 #include <stdlib.h> 定义函数 void *calloc(size_t nmemb,size_t size); 函数说明 calloc()用来配置nmemb个相邻的内存单位,每一单位的大小为size,并返回指向第一个元素的指针。这和使用下列的方式效果相同:malloc(nmemb*s
calloc 配置内存空间 相关函数 malloc,free,realloc,brk 表头文件 #include <stdlib.h> 定义函数 void *calloc(size_t nmemb,size_t size); 函数说明 calloc()用来配置nmemb个相邻的内存单位,每一单位的大小为size,并返回指向第一个元素的指针。这和使用下列的方式效果相同:malloc(nmemb*
所以我不确定是0还是2。 如果有人知道请告诉我。