This is not really a problem but a small doubt.
I was creating a function to insert a key value in a linked list.

void Insert_val(ListNode **l , int x)//to insert value of x;
{
    ListNode *p ;//create a pointer to datatype ListNode
    p = malloc(sizeof(ListNode));//give pointer chunk from memory to store data
    p->val = x;//value of p is x
    p->next = *l;// next ptr of p points to 1st node
    *l = p;//head ptr of list points to p making it first node
}

After allocating memory to a pointer how it divides memory into two parts that contain value x and next pointer?
How does p pointer do that pointer p just points to a datatype of type ListNode when given a random chunk of memory, how it divides it so that it make the required datatype?

推荐答案

您的措辞"将内存分配给指针"并没有真正描述正在发生的事情.您没有为其分配内存的指针.

我认为情况正好相反.malloc()会找到一些所需大小的内存供您自由使用.它会将地址返回给您,并记下此内存现在已使用,例如,下次您拨打malloc()时无法使用.然后将该值(地址)写入您的指针变量,我会将其表述为"您的代码在Malloc调用后将返回的地址分配给指针变量",而Malloc本身并不知道该指针.

"将内存分为包含值x和下一个指针的两部分"不是malloc()的一部分.这就是您正在做的事情;尽管您可能没有意识到并且间接地告诉编译器所分配的内存现在与您正在使用的用于"p指向的内容"的 struct 类型所定义的 struct 一起使用.

编译器只是相信您"当给出一个随机的内存块时,p只指向一个ListNode类型的数据类型",因为您的代码是这么说的.你的责任,你的风险.因为许多与指针/Malloc相关的问题都来自于程序员没有真正涉及到这一责任.

我建议找一本书来了解这些问题,也许是教程.

C++相关问答推荐

在C中使用强制转换将uint16_t转换为uint8_t [2]是否有效?

标准的C17标准是用括号将参数包装在函数声明中吗

自定义应用程序上的日志(log)轮换问题

GCC预处理宏和#杂注GCC展开

将整数的.csv文件解析为C语言中的二维数组

如何将常量char*复制到char数组

Linux不想运行编译后的文件

C在声明带有值的数组时,声明大小有用吗?

是什么让numpy.sum比优化的(自动矢量化的)C循环更快?

getline()从c中的外部函数传递指针时输出null

C代码在字符串中删除不区分大小写的子字符串的问题

处理来自浏览器的HTTP请求

循环中的静态变量与块中的变量和循环

当用C打印过多的';\n';时输出不正确

在我的函数中实现va_arg的问题

struct 中的qsort,但排序后的 struct 很乱

std::malloc/calloc/realloc/free 与纯 C 的 malloc/calloc/realloc/free 有什么不同

Clang 是否为内联汇编生成了错误的代码?

返回指向函数内声明的复合文字的指针是否安全,还是应该使用 malloc?

将十六进制值或十进制值分配给 uint16_t 有什么区别?