Tag: 免费

释放未初始化的指针会导致未定义的行为吗?

如果你有一个未初始化的指针,并且错误地尝试释放它,这是否会导致未定义的行为? 喜欢: int main(void){ char *string; free(string); return 0; }

在C中调用free()

当我打电话给free(a)时到底发生free(a)什么? 我知道它释放了所使用的内存,但这是否意味着无法再访问存储在数组a中的数据(因此,无法调用copyArray )? int *a = (int *) malloc(sizeof(int) * numberOfInts); for (i = 0; i < numberOfInts; i++) { a[i] = random(); printf("%d\n", a[i]); } free(a); copyArray(*a++, numberOfInts);

* glibc检测到双重免费或腐败()*消息!

运行程序时,以下deleteNode函数得到以下结果: * glibc检测到 free():无效的下一个大小(正常):0x000000000103dd90 * * 即使我做’自由(这里); ‘评论,我收到上述消息。 我不认为其他“免费”电话会引发这样的问题。 但我不明白为什么这会是错的。 :/ struct List *deleteNode(int Code,int i,char* Number) { struct List *here; here=Head; for (here; here!=Tail; here=here->next) { if ( (here->number==Number) && (here->code==Code) )//found node on the List { if (here->previous==Head) //delete from beginning { Head=here->next; here->next->previous=Head; } else if (here->next==Tail) //delete from the end { […]

我如何知道何时应该释放库函数返回的C中的字符串?

我应该使用free() ¹自己在C中释放哪些字符串? 我的知识状态: char a[256]; :不 char *a = “abcdefg”; :不 char *a = malloc(15L); :是的 getenv()返回的字符串: no Windows函数返回的字符串²:??? ¹或LocalFree() / GlobalFree() / VirtualFree() ²特别是GetCommandLineW()

第一个元素偏移

它是保证,结构的第一个元素的偏移是0吗? 为了更准确,我们考虑一下 struct foo { int a; double b; }; struct foo *ptr=malloc(sizeof(struct foo)); int *int_ptr = &ptr->a; free(int_ptr) 在任何操作系统或任何其他因素下,它是否始终有效?

为什么没有内存泄漏?

以下内容旨在获取一个可变长度的常量char,并以一种很好的格式打印出来以进行日志记录。 我相信读者会对如何改进这方面提出建议,我对此表示欢迎。 令我困惑的是,我希望每次调用ToHexString()时都需要free()返回的静态char。 相反,我认为没有任何内存泄漏。 即使我使用内联函数,因此也不会将其返回值赋给变量。 我创建了一个简单的测试,在循环中调用此函数,每次使用不同长度的cString和nMaxChars参数。 然后我看了VM的状态。 我的测试程序和可用内存的内存分配从未改变。 在我看来,每次调用malloc并且没有空闲时它应该增加。 static char *ToHexString(const char *cString,int nMaxChars) { static char *cStr; /*if (80>strlen(cString)) nRawChars=strlen(cString); if (nMaxChars>nRawChars) nRawChars=nMaxChars; */ if (nMaxChars==0) nMaxChars=80; printf(“There are %i chars\n”,nMaxChars); char *cStr1; char *cStr2; char *cStr3; int nLen=nMaxChars*6; cStr=calloc(nLen,sizeof(char)); cStr1=calloc(10,sizeof(char)); cStr2=calloc(nLen,sizeof(char)); cStr3=calloc(nLen,sizeof(char)); cStr1[0]=’\0′; cStr2[0]=’\0′; cStr3[0]=’\0′; int nC1=0; int nRowCnt=0; for (nC1=0;nC1<nMaxChars;nC1++) { […]

释放二叉树C的记忆

我想从我分配的二叉树中释放内存,这样做最好的遍历是什么? typedef struct Node{ struct Node * right; struct Node * left; void * data; }Node; typedef int (*cmp) (void*,void *); Node* init(void * element){ Node * newNode=(Node*)malloc(sizeof(Node)); newNode->data=element; newNode->left=NULL; newNode->right=NULL; return newNode; } void insert(void * element, Node** root,cmp compareTo){ if(*root==NULL){ *root=init(element); return; } if(compareTo(element,(*root)->data)==1) insert(element,&((*root)->left),compareTo); else insert(element,&((*root)->right),compareTo); }

我释放后仍然可以打印一个字符串?

我正在学习和测试C中的内存分配,我想测试如果调用free()会发生什么。 我预计在运行下面的程序后可能会出现分段错误或指针为NULL 。 但是,我仍然可以像输出一样成功打印字符串。 我还尝试将str释放两次,然后在输出2发生时出现错误。 似乎先前分配的内存已成功解除分配,但内存中的数据未被清除。 那是对的吗? 如果是这种情况,程序什么时候会清理那些解除分配的内存空间? 如果数据被解除分配但没有清理,那是否安全? 上述任何问题的答案都会有所帮助! 谢谢! 码 #include #include int main() { printf(“Hello, World!\n”); char *str = (char *)malloc(24); char *str2 = “tutorialspoint”; strcpy(str, str2); free(str); printf(“[str] %s\n”, str); return 0; } 产量 Hello, World! [str] tutorialspoint 输出2 main(83218,0x7fff9d2aa3c0) malloc: *** error for object 0x7fb0b2d00000: pointer being freed was not […]

free()跟随指针吗?

我确定它没有,但也许它里面有黑魔法,所以这是我的问题: 如果我有这样的结构: struct mystr { char * strp, unsigned int foo, }; 我为它分配内存,并希望稍后发布。 我必须这样做吗? free(mystr_var->strp); free(mystr_var); 或者是最后一行, free()函数是否遵循指针并释放它们两个?

为什么free()只将8个第一个字节设置为零?

我有一个关于free()行为的问题。 Juste一个使用malloc和strcpy char *的简单代码。 所以,所有都是在HEAP上设置的: (gdb) x/100b 0x602010 0x602010: 66 111 110 106 111 117 114 32 0x602018: 116 111 117 116 32 108 101 32 0x602020: 109 111 110 100 101 0 0 0 0x602028: 0 0 0 0 0 0 0 0 0x602030: 0 0 0 0 0 0 0 0 0x602038: 33 […]