Tag: dereference

无法递增解除引用指针的值

我似乎有一个简单程序的问题,该程序应该计算文件中的各种字符类型。 即使文件根本不为空,它也始终打印零。 我认为它与指针有关,可能是错的。 我还想知道在这种情况下是否需要初始化变量? // fun.h void count_char(FILE *f, unsigned *newl, unsigned *let, unsigned *num, unsigned *spec_char); // main.c #include #include “fun.h” int main() { unsigned newline = 0, number = 0, letter = 0, special_character = 0; char path[256]; FILE *f_read; printf(“Insert a file path: “); gets(path); f_read = fopen(path, “r”); if(f_read == NULL) […]

结构和指针指针

我正在学习链接列表以及如何使用结构和指针在C中创建它们。 我在下面有一个例子。 根据我的理解,被调用的push()传递结构的起始内存位置,其中头节点作为参数。 我们的push()函数的参数将struct节点作为指针的指针,因此它作为引用而不是实际副本传递。 因此,我们的struct node ** headref的第一个指针只是指向头节点的内存位置的指针,第二个指针指向该值,该值是头节点指向的下一个内存位置。 我们在struct节点中创建一个名为newnode的新节点,为它分配一些内存。 然后,我们在此节点内创建一个int类型数据。 好吧,假设我说的一切都是正确的,下一部分就是我对此感到困惑。 newNode->next= *headRef; 从我能理解的这一行取消引用headref所以这将使headref指向头节点。 然后我们有一个指针操作,其中headref指向的内容也将是我们的指针接下来指向的内容。 基于此,我们的新节点(newnode)中的下一个指针将指向头指针。 我也困惑的下一行是: *headRef = newNode; 取消引用的headref指针指向的是头节点,现在将指向我们的newnode。 基于此,应该有一个名为newnode的新节点,其中包含一个int数据,另一个指针将我们的newnode链接到头部。 然后headref指针(或者它是头节点?)将指向新节点。 我知道这是不正确的,因为我们的newnode旁边的指针应该指向第二个节点,所以我们的newnode可以在struct中链接。 我也不相信我理解上面两行代码中指针和解除引用的指针。 码: void Push(struct node** headRef, int data) { struct node* newNode = malloc(sizeof(struct node)); newNode->data = data; newNode->next = *headRef; *headRef = newNode; } void PushTest(void) { struct node* head […]

为什么在将地址在指针中的内存中打印之前,我们必须将void指针强制转换为int或其他内容?

我想知道为什么有必要在打印内存中的地址内容之前将void指针强制转换为int *或char * ,即使我们告诉printf()函数如何解释内存中的数据? 假设我们有以下代码: int main (void) { void* c = malloc(4); printf(“%d”,*c); return 0; } 为什么不可能这样做? 所以要明确我的问题是,这是不可能的原因是什么? 编辑:在所有答案和研究之后,我仍然不确定编辑中的致命错误究竟在哪里。 我感到困惑的主要原因是我的编译器(gcc)在告诉“取消引用void指针”时只给出一个警告。 这是实际的错误吗? 据我所知,即使有警告,该程序仍应编译。 EDIT2我仍然感到困惑的是,我们有一个ERROR和WARNING的原因似乎是完全独立的,但是由同一段代码生成: pointer.c:7:13: warning: dereferencing ‘void *’ pointer printf(“%d”,*p); ^~ pointer.c:7:13: error: invalid use of void expression printf(“%d”,*p); 有些用户说只有在我们尝试使用derefenciation的结果时才会出现错误,并且警告是在我们为VOID指针实际分配内存时。 显然不是这种情况,因为如果我们删除printf行,我们确实只会得到一个警告但是完全没有一个警告。 pointer.c:6:8: warning: unused variable ‘p’ [-Wunused-variable] void * p=malloc(4);

将指针打印到整数会导致分段错误。 为什么?

#include main() { int *num2=20; printf(“\n\n\n%d”,num2); } 当我按原样运行时,它打印20 。 如果我使用*num2 ,则会导致分段错误。 为什么?

取消引用void指针

为了更好地理解这篇文章中给出的答案,有人可以向我解释是否可以实现以下循环缓冲区,如果没有,为什么不能。 #define CB_TYPE_CHAR 0 #define CB_TYPE_FLOAT 1 … typedef struct CBUFF { uint16 total; /* Total number of array elements */ uint16 size; /* Size of each array element */ uint16 type; /* Array element type */ uint16 used; /* Number of array elements in use */ uint16 start; /* Array index of first unread […]

取消引用空指针在sizeof操作中有效

我遇到了一段代码片段,对我来说应该会因为分段错误而崩溃,但它可以毫无障碍地工作。 有问题的代码加上相关的数据结构如下(上面找到相关的评论): typedef struct { double length; unsigned char nPlaced; unsigned char path[0]; } RouteDefinition* Alloc_RouteDefinition() { // NB: The +nBags*sizeof.. trick “expands” the path[0] array in RouteDefinition // to the path[nBags] array RouteDefinition *def = NULL; return (RouteDefinition*) malloc(sizeof(RouteDefinition) + nBags * sizeof(def->path[0])); } 为什么这样做? 我认为char *的大小将解析为给定体系结构上指针的大小,但是在取消引用NULL -pointer时不应该崩溃和刻录?