【发布时间】:2018-09-17 15:16:43
【问题描述】:
我意识到这个问题已经被问过好几次了,但没有一个解决方案对我有任何帮助。我正在编写一个实验室程序,该程序在 C 中分配大量内存,特别是一个 char 指针数组,每个指针都分配了 4096 字节的内存页面大小。
char** pgs =(char**) malloc(sizeof(char *) * pages);
if(pgs == NULL){
printf("Failed to allocate memory");
exit(0);
}
int i;
for(i = 0; i < pages; i++){
pgs[i] = malloc(4096);
/*if(pgs[i] == NULL){
printf("Failed to allocate memory");
exit(0);
}*/
*pgs[i] = "\0";
/*if(pgs[i] == NULL){
printf("Failed to allocate memory");
exit(0);
}*/
}
在程序的中间,这个数组的元素被随机访问和修改,以引起抖动(作为实验室的一部分):
while(time(NULL) - startTime < seconds){
long rando = rand() % pages;
if(modify > 0){
*pgs[rando]++;
}
else{
long temp = *pgs[rando];
}
在程序结束时,我尝试释放此内存:
for(i = 0; i < pages; i++){
free(pgs[i]);
}
free(pgs);
然而,我得到了可怕的“无效指针”错误。如果有人对如何解决此问题有任何建议或知识,请分享。
【问题讨论】:
-
请准确缩进代码。另外,不要包含注释掉的代码——并且不要包含两个被注释掉的代码副本。这将有助于更容易理解您的要求。
-
您没有收到
*pgs[i] = "\0";的编译器警告吗?不要发布编译器抱怨的代码,除非您的问题是“为什么编译器抱怨此代码?” -
您的问题是您的修改代码
*pgs[rando]++;等效于*(pgd[rando]++),而不是您想象的(*pgs[rando])++;。您正在增加指针,而不是指向的数据。因此,当您释放它时,分配的不是指针,因此您会收到消息。 -
另外,通常使用
exit(1);或exit(EXIT_FAILURE);表示程序失败;exit(0);或exit(EXIT_SUCESS);表示程序成功。 —— 请注意,您的修改代码仅修改了每页分配的 4096 字节中的一个字节,因此它并不会真正地影响内存管理(至少,大多数缓存一次缓存少于 4096 字节)。 -
*pgs[i] = "\0";应该是*pgs[i] = '\0';注意'x'与"x"不同
标签: c pointers memory malloc free