由于使用指向结构的指针的函数,for 循环意外中断

Posted

技术标签:

【中文标题】由于使用指向结构的指针的函数,for 循环意外中断【英文标题】:for loop unexpectedly breaks due to a function which uses pointer to a structure 【发布时间】:2021-11-23 18:48:26 【问题描述】:

每当我尝试在 c 中使用以下代码时,for 循环在一次迭代后就会中断,我无法弄清楚究竟是为什么。如果不使用 for 循环,那么它工作正常,我做了测试。请帮忙。

#include<stdio.h>
#include<stdlib.h>

struct stack 

    int top;
    int n;
    char *arr;
;

void push(struct stack *ptr,char x);

int main()
    struct stack chs;
    struct stack *ptr;
    ptr = &chs;
    ptr->top=-1;
    printf("enter the size of stack: ");
    scanf("%d",&ptr->n);
    int size = ptr->n;
    for(int i=0 ; i < size ; i++)
        printf("test iteration ");
        push(ptr,'a');
    
    
    return 0;


void push(struct stack *ptr,char x)
    if(ptr->top >= (ptr->n-1))
        printf("\nstack overflow\n");
        return;
    
    else
        ptr->top = (ptr->top) + 1;
        ptr->arr[(ptr->top)] = x;
    

【问题讨论】:

结构的char *arr 元素未初始化,因此ptr-&gt;arr[(ptr-&gt;top)] 是未定义的引用。那时的行为是未定义的。 【参考方案1】:

如评论中所述,成员 arr 从未初始化为指向任何内容。您可以通过将代码修改为以下内容来解决问题:

#include<stdio.h>
#include<stdlib.h>

struct stack 

    int top;
    int n;
    char *arr;
;

void push(struct stack *ptr,char x);

int main()
    struct stack chs;
    struct stack *ptr;
    ptr = &chs;
    ptr->top=-1;
    printf("enter the size of stack: ");
    scanf("%d",&ptr->n);
    int size = ptr->n;

    char chs_arr[size]; // Variable-sized array based on input

    ptr->arr = chs_arr; // Set pointer member arr to point to array created.

    for(int i=0 ; i < size ; i++)
        printf("test iteration ");
        push(ptr,'a');
    
    
    return 0;


void push(struct stack *ptr,char x)
    if(ptr->top >= (ptr->n-1))
        printf("\nstack overflow\n");
        return;
    
    else
        ptr->top = (ptr->top) + 1;
        ptr->arr[(ptr->top)] = x;
    

【讨论】:

以上是关于由于使用指向结构的指针的函数,for 循环意外中断的主要内容,如果未能解决你的问题,请参考以下文章

循环结构 函数及中断控制 case语句

中断for循环后如何重置指针

Day03 循环&case条件&函数&中断控制

循环队列的实现

如何使用指向结构的指针

c++ 内存分配向量的指针