Tag: 指针

从文件中读取单词到简单的链表

我需要编写一个程序来读取文件,然后将这些单词保存到链表中以供进一步使用。 我决定使用fgetc逐个字符地读取文本,然后每次检测到换行符( ‘\n’ )或空格( ‘ ‘ )时将全部保存到列表中,表示一个单词。 对不起,我是文件指针的新手,这是我到目前为止所得到的: struct list { //global char string[30]; struct list *next; }; int main(void) { FILE *filePtr; char file[] = “text.txt”; char tempStr[30]; list *curr, *header; char c; int i = 0; curr = NULL; header = NULL; if((filePtr = fopen(file, “r”)) == NULL) { printf(“\nError opening file!”); getchar(); […]

链表遍历**与(thead!= NULL)**和while(thead-> next!= NULL)之间的差异

任何人都可以告诉我while(thead!= NULL)和while(thead-> next!= NULL)之间的区别是什么因为遍历列表thead!= NULL在thead-> next工作时不起作用 。 根据我的理解,head节点只是指向起始节点的指针,而不是起始节点本身。 如果你有疑问,请看这个 。这里只是存储地址。 // thead表示临时头变量以存储地址头指向。 这是插入的代码。 #include #include #include struct node { int data; struct node *next; }; struct node *head; void insert(int x) { struct node *temp=(struct node *)malloc(sizeof(struct node)); temp->data=x; temp->next=NULL; if(head==NULL) { head=temp; } else { struct node * thead; thead=head; while(thead->next!=NULL) { thead=thead->next; } […]

C / C ++:解除分配或删除动态创建的内存块

可能重复: C ++ delete – 它会删除我的对象,但我仍然可以访问数据? 我试图在C / C ++中释放一块动态创建的内存。 但是我使用的标准方法(malloc / free和new / delete)似乎都是function失调的。 下面给出的两个代码的o / p是相似的。 这是使用malloc / free的代码: #include #include int main(){ int * arr; arr = (int *)malloc(10*sizeof(int)); // allocating memory int i; for(i=0;i<10;i++) arr[i] = i; for(i=0;i<10;i++) printf("%d ",arr[i]); printf("\n"); free(arr); // deallocating for(i=0;i<10;i++) printf("%d ",arr[i]); printf("\n"); } 这是使用new / […]

传递数组,指向C中的int

经过多年与Matlab合作,我是C的新成员。 我有一个构造数组的函数,我需要将它返回到main()。 我有arrays与指针的常见问题,并且通过摆弄想出如何做到这一点。 但是这个小提琴给我留下了一个基于以下代码的概念性问题。 #include void array_set(int y_out[2][2]); void int_set_wrong(int y); void int_set_right(int *y); int main (int argc, const char * argv[]) { int y_array[2][2]={{0,0},{0,0}}; int y_int_1 = 0; int y_int_2 = 0; array_set(y_array); int_set_wrong( y_int_1 ); int_set_right( &y_int_2 ); printf(“\nValue array: %d \n”,y_array[0][0]); printf(“Value int wrong: %d \n”,y_int_1); printf(“Value int right: %d \n”,y_int_2); return […]

结构和指针指针

我正在学习链接列表以及如何使用结构和指针在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 […]

是否有用于确定帧指针未被消除的gcc宏?

当使用-fomit-frame-pointer(对于各种-O设置自动)时,执行回溯是有问题的。 我想知道是否有一种方法可以在编译时确定代码是用这个开关编译的? 在那种情况下,我可以放入一个#ifndef来防止在不明智的情况下进行反向追踪。 当此-fomit-frame-pointer开关打开时是否设置了任何宏? 谢谢, 那么setjmp

三星:char *(* arr)和char *** arr(在C中)有什么区别?

基本上,我有一个char *数组,我想在这个函数中传递和修改,所以我传入一个指向char *数组的指针。 也就是说,我想传递一个指向char * arr []的指针。 两者有什么区别?

将指向较大结构的指针转换为指向较小结构的指针

这篇文章将以此为基础,但将更加通用。 通常我会看到指向大型结构的指针被转换为指向较小结构的指针,我认为这是有效的,因为指针只是结构中第一个字节的地址。 我还有一个问题是,当大多数方法没有指向他们期望的类型时,如何处理指针。 我将使用Socket API作为示例: sockaddr_storage比sockaddr但是指向sockaddr指针会被转换为指向sockaddr指针,然后才会传递给sockaddr这样的函数 int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); 因此,当指针指向比预期更大的结构时,如何处理函数。 他们说 “哦,传给我的大小( socklen_t addrlen )比我想象的要大。最好把这个指针扔回sockaddr_storage !” 然后像这样访问其成员? 或者他们做了更复杂的事情?

const指针修复变量变量

我无法弄清楚如何告诉C我想要一个不会移动的指针。 它总是指向同一个数组。 也就是说,数组成员不是常量,但数组本身是全局的,因此,它处于固定位置。 所以,当我编码时: #include int v[2]={0, 1}; const int *cpv=v; int main(void) { v[1]=2; printf(“%d\n”, v[1]); *(cpv+1)=3; printf(“%d\n”, v[1]); cpv[1]=4; printf(“%d\n”, v[1]); } 并得到这个错误: constp.c: In function ‘main’: constp.c:9: error: assignment of read-only location ‘*(cpv + 4u)’ constp.c:10: error: assignment of read-only location ‘*(cpv + 4u)’ 我知道编译器认为我需要一个const int v[2]来使用const int *iv 。 如何获得一个常量指针来完成这项工作? 如果你看到错误信息,我甚至没有移动指针(如pv++ […]

如何在C函数中自动生成双指针参数?

我有一个名为make5的简单函数,它使2d矩阵中的每个元素都等于5,如下所示: int make5(int r, int c, double **d) { int i, j; for (i = 0; i < r; i++) { for (j = 0; j < c; j++) { d[i][j] = 5; } } return 0; } 我希望能够使用以下调用在不同的矩阵上运行此函数: make5(2, 3, a); make5(2, 4, b); 其中a和b已被声明为指向数组数组的指针。 但是当我尝试这个时,我不断收到分段错误。 如何更改make5以便我可以在a和b上运行它?