1.写出下面程序的可能会出现什么问题。【】 int *create() { int *p=(int *)malloc(sizeof(int)); return p; } int destory(int *p) { free(p); p=NULL; } int main() { int *p = create(); destory(p); }
时间: 2023-08-14 22:07:25 浏览: 198
程序有一个潜在的问题:在运行 `destory(p)` 函数时,由于 `p` 已经被释放,因此在执行 `p=NULL` 语句时,会导致空指针解引用错误。正确的做法是将 `p` 赋值为 `NULL`,然后再调用 `free(p)`。修改后的程序如下所示:
```
int *create() {
int *p = (int *)malloc(sizeof(int));
return p;
}
int destory(int *p) {
free(p);
p = NULL;
}
int main() {
int *p = create();
destory(p);
p = NULL;
}
```
相关问题
int** grid=(int**)malloc(sizeof(int*)*gridSize)
这个C风格的代码片段是在分配一个动态数组,其中每个元素都是一个整数指针(`int *`),用于存储二维网格(`gridSize` x `gridSize`)。`malloc()`函数在这里的作用是为指定大小(`sizeof(int*) * gridSize`)的内存分配空间。
以下是详细的步骤:
1. 使用`sizeof(int*)`计算单个整数指针所需的字节数,因为`malloc()`需要一个整数来表示要分配的字节数。
2. `*(int **)`操作符用于创建一个指向整数指针的指针,这样`malloc()`返回的是一个可以存放整数指针的数组。
3. `malloc(sizeof(int*)*gridSize)`表示分配一个可以容纳`gridSize`个整数指针的内存区域。
示例代码演示如下:
```c
#include <stdlib.h> // 包含malloc函数
int** createGrid(int gridSize) {
// 分配内存
int** grid = (int**)malloc(sizeof(int*) * gridSize); // 创建一个gridSize大的指针数组
if (!grid) { // 检查内存分配是否成功
perror("Memory allocation failed");
return NULL;
}
// 初始化每个指针到NULL,以表明该位置未填充
for (int i = 0; i < gridSize; i++) {
grid[i] = NULL;
}
return grid;
}
// 示例调用
int gridSize = 3;
int** myGrid = createGrid(gridSize);
```
#include<func.h> void *pthradfunc(void*arg) { int *q=(int*)arg; free(q); pthread_exit(NULL); } int main(int argc,char *argv[]) { int *q=(int*)malloc(sizeof(int)*256); memset(q,0,sizeof(int)); *q=1000; pthread_t tid; pthread_create(&tid,NULL,pthradfunc,q); sleep(1); *q=1001; printf("%d\n",q[0]); free(q); return 0; } 这段程序我不是在子线程里面free掉了申请的空间 然后在子线程里对已经释放的空间在修改 为什么不会报错
这是因为在C语言中,free函数只是将指向动态分配内存的指针所指向的内存块的使用权交还给了系统,在释放内存后并没有对指针所指向的地址做出任何改变,所以在主线程中对已经释放的内存空间进行修改并不会导致程序崩溃。但是这种修改是不安全的,因为操作系统可能会在释放内存后将其分配给其他进程使用,所以在子线程中修改已经释放的内存空间可能会对其他进程造成影响。因此,在程序中应该避免对已经释放的内存空间进行修改操作,以免引起意想不到的错误。
阅读全文