c语言中,void** p=(void**)malloc(sizeof(char)*size),是什么意思?
时间: 2024-08-16 19:02:39 浏览: 39
在 C 语言中,`void** p = (void**) malloc(sizeof(char) * size)` 这行代码的意思是:
1. 定义了一个指向指针的指针 `p`,即它是一个可以存储其他指针的变量。
2. 使用 `malloc` 函数动态分配了一块大小为 `sizeof(char) * size` 的内存空间。`sizeof(char)` 通常等于 1,因为它是所有基本数据类型的最小单位,`size` 是一个预先确定的整数值,表示所需的字节数。
3. `(void**)` 是强制类型转换,将 `malloc` 返回的 `void*` 指针转换成 `void**` 类型的指针。这是因为 `malloc` 返回的是通用的内存地址,通过转换,我们可以明确表示这个地址是保存另一个 `void*` 指针的。
这行代码通常用于需要动态分配内存,并能处理不同类型指针的应用场景,比如函数参数传递、动态数组的创建等。注意,动态分配的内存必须在不再使用时通过 `free` 函数释放,避免内存泄漏。
相关问题
C语言 *p=(char*)malloc(1+sizeof("testing"));什么意思
这段代码的作用是动态分配内存空间,并将其地址存储在指针变量p中。具体来说,这段代码的含义如下:
1. sizeof("testing")用于计算字符串"testing"所占用的字节数,这里为7个字符加上字符串结尾的空字符'\0'所占用的1个字节,因此sizeof("testing")的值为8。
2. 在进行内存分配之前,需要将其类型进行强制转换,即(char*)malloc(1+sizeof("testing"))。这是因为在C语言中,malloc函数返回的是void*类型的指针,需要将其转换为需要的类型。在这里,我们将其转换为char*类型的指针。
3. malloc函数用于动态分配内存空间,它的参数为所需的字节数。这里我们需要分配的内存空间大小为1+sizeof("testing"),即8个字节。
4. 将malloc函数返回的指针赋值给指针变量p,即*p=(char*)malloc(1+sizeof("testing"))。这样,指针变量p就指向了动态分配的内存空间。
总的来说,这段代码的作用是动态分配了一个长度为8个字节的内存空间,并将其地址存储在了指针变量p中。需要注意的是,在使用完动态分配的内存空间后,需要使用free函数将其释放,以避免内存泄漏的问题。例如:
```c
char *p = (char*)malloc(1+sizeof("testing"));
strcpy(p, "testing");
printf("%s\n", p);
free(p);
```
这里,我们使用strcpy函数向动态分配的内存空间中赋值了字符串"testing",然后输出了该字符串,最后使用free函数释放了动态分配的内存空间。
#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函数只是将指向动态分配内存的指针所指向的内存块的使用权交还给了系统,在释放内存后并没有对指针所指向的地址做出任何改变,所以在主线程中对已经释放的内存空间进行修改并不会导致程序崩溃。但是这种修改是不安全的,因为操作系统可能会在释放内存后将其分配给其他进程使用,所以在子线程中修改已经释放的内存空间可能会对其他进程造成影响。因此,在程序中应该避免对已经释放的内存空间进行修改操作,以免引起意想不到的错误。
阅读全文