即使不为了什么远大理想,为了好好生活,你也得努力奋斗啊,不然别说什么风花雪月了,柴米油盐也能让你一筹莫展。
----小新
1.malloc()
这个函数用于在堆中动态分配内存。其原型是void* malloc(size_t size);
,其中size是要分配的内存的字节数。如果分配成功,malloc返回一个指向新分配内存的指针,如果分配失败,则返回NULL。
int *ptr = (int*)malloc(sizeof(int));
if (ptr == NULL) {
printf("Memory not allocated.\n");
exit(0);
} else {
printf("Memory successfully allocated using malloc.\n");
}
2.calloc()
这个函数用于在堆中动态分配内存,并初始化内存为零。其原型是void* calloc(size_t num, size_t size);
,其中num是要分配的内存块的数量,size是每个块的字节数。如果分配成功,calloc返回一个指向新分配内存的指针,如果分配失败,则返回NULL。
int *ptr = (int*)calloc(1, sizeof(int));
if (ptr == NULL) {
printf("Memory not allocated.\n");
exit(0);
} else {
printf("Memory successfully allocated using calloc.\n");
}
realloc()
用于改变已分配内存的大小。这个函数的原型是void* realloc(void* ptr, size_t newSize);
其中ptr是原始内存块的指针,newSize是新的内存大小(以字节为单位)。如果分配成功,realloc返回一个指向新内存块的指针,如果分配失败,则返回NULL。
int *newPtr = (int*)realloc(ptr, 2 * sizeof(int));
if (newPtr == NULL) {
printf("Memory not re-allocated.\n");
free(ptr);
exit(0);
} else {
printf("Memory successfully re-allocated using realloc.\n");
ptr = newPtr;
}
free()
释放这些内存。否则,这些内存块可能不会被回收,导致程序消耗的内存越来越多,这种现象被称为内存泄漏。
void free(void *ptr); //释放内存,但是指针还是可以用
如果你使用malloc
,calloc
或realloc
等函数来分配内存,但分配的内存块大小超过了你系统可用的内存,那么可能会导致内存溢出。另外,如果你在使用完动态分配的内存后忘记使用free
来释放内存,那么也会导致内存泄漏。
如果你在数组中写入超出其长度的位置,这可能会覆盖其他内存位置,从而可能导致内存溢出。
如果递归调用没有正确的结束条件或者在每次递归时都创建新的数据结构,那么可能会导致内存使用量无限增长,最终导致内存溢出。
如果你在程序中创建非常大的数据结构(如大数组或链表),并且没有为这些数据结构分配足够的内存,那么可能会导致内存溢出。
(1)strcat
strcat
用于将一个字符串附加到另一个字符串的末尾。
可能导致内存溢出,因为它不会检查目标字符串的容量,如果目标字符串不足以容纳被附加的内容,就会溢出。
改进方法:使用 strncat
函数,该函数接受一个额外参数,指定要附加的最大字符数,从而避免溢出。
(2)strncat
strncat
具有改进版的 strcat
,可以控制附加的字符数。
仍然需要小心,确保指定的字符数不会超过目标字符串的容量。
(3)strcmp
: strcmp
用于比较两个字符串是否相等。
不会导致内存溢出,但可能导致无限循环或错误,如果比较的字符串没有正确的终止符。
改进方法:使用 strncmp
函数,并始终确保比较的字符串以 null 结尾。
(4)strcpy
: strcpy
用于将一个字符串复制到另一个字符串。
可能导致内存溢出,因为它不会检查目标字符串的容量,如果目标字符串不足以容纳被复制的内容,就会溢出。
改进方法:使用 strncpy
函数,该函数接受一个额外参数,指定要复制的最大字符数,从而避免溢出。
如果你试图解引用一个空指针,或者解引用一个指向已经被释放的内存的指针,那么可能会导致内存溢出。