【问题标题】:Why is my pointer ("char *item") variable being treated as a regular variable ("char item")?为什么我的指针(“char *item”)变量被视为常规变量(“char item”)?
【发布时间】:2021-09-05 14:53:19
【问题描述】:

我有一个堆栈实现,它在堆栈上存储变量:char *items。但是由于某种原因,当我使用 stack->items[position] 时,它会将其视为常规字符(不是指针),并且我无法将完整的字符(它是 URL)存储在堆栈上。

我想给 push 函数一个 char *(这是一个 URL),我想把它放入我的堆栈中,即:

p->items[p->pos] = item;

strcpy(p->items[p->pos], item);

这是给出错误的代码部分:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "shm_stack.h"

typedef struct int_stack{
      int size;               /* the max capacity of the stack */
      int pos;                /* position of last item pushed onto the stack */
      char *items;             /* stack of stored chars */
} ISTACK;

int is_full(ISTACK *p){
      if ( p == NULL ) {
          return 0;
      }
      return ( p->pos == (p->size -1) );
}

int sizeof_shm_stack(int size){
      return (sizeof(ISTACK) + sizeof(char) * size);
}

int init_shm_stack(ISTACK *p, int stack_size){
      if ( p == NULL || stack_size == 0 ) {
          return 1;
      }

      p->size = stack_size;
      p->pos  = -1;
      p->items = (char *) (p + sizeof(ISTACK));
      return 0;
}


ISTACK *create_stack(int size){
      int mem_size = 0;
      ISTACK *pstack = NULL;

      if ( size == 0 ) {
          return NULL;
      }

      mem_size = sizeof_shm_stack(size);
      pstack = malloc(mem_size);

      if ( pstack == NULL ) {
          perror("malloc");
      } else {
          char *p = (char *)pstack;
          pstack->items = (char *) (p + sizeof(ISTACK));
          pstack->size = size;
          pstack->pos  = -1;
      }

      return pstack;
}

void destroy_stack(ISTACK *p){
      if ( p != NULL ) {
          free(p);
      }
}

int push(ISTACK *p, char *item){
      if ( p == NULL ) {
          return -1;
      }

      if ( !is_full(p) ) {
          ++(p->pos);
          //p->items[p->pos] = item;
          strcpy(p->items[p->pos], item);
          //printf("push method: %d\n", p->items[p->pos]);
          return 0;
      } else {
          return -1;
      }
}

问题出在我的 push 方法中,我既不能使用 strcpy() 也不能只将 char 分配给 p->items[p-pos] 而不说“从不兼容的类型 char * 分配 char”,而是取消引用“item”只会给我第一个字符,我想要整个“string”。

为什么会发生这种情况,我该如何解决?

【问题讨论】:

  • p-&gt;items[p-&gt;pos] 是单个字符。你需要一个二维数组。例如char **items; 然后做动态分配。您还没有展示如何分配 items 字段,因此很难解释它如何适合您的代码。
  • 还要注意strcpy 绝不等同于指针赋值。您可以使用任何一种方法构建堆栈,但这些方法有不同的考虑因素,这些因素会影响您如何设计、构建和使用结果的多个方面。
  • @kaylum char **items; 不是 2D 数组,但它可用于实现类似于 2D 数组的数据结构。
  • @kaylum 我已经包含了我如何初始化这些字段。我最终得到了一种堆栈的启动代码/模板(但他们使用 int* 而不是使用 char*)所以我想我可以将 int* 更改为 char* 虽然现在我不太确定这是否是你来做。

标签: arrays c pointers char stack


【解决方案1】:

p-&gt;itemschar*,所以 p-&gt;items[...]charstrcpy 需要 char*,因此您提供的内容与需要的内容不匹配。

不仅如此,它还期望指针指向包含要复制的字符串的足够字符中的第一个。您甚至没有尝试获取item 指向的字符串的长度,更不用说分配足够的内存了为它。


我想你想要一堆字符串。如果是这样,我们需要一个指针数组 (char *items[]) 或一个指向内存块的指针 (char **items)。后者在这里更简单。因此,

char *items;

应该是

char **items;

它会被分配使用

malloc(sizeof(char*) * size)

将字符串添加到堆栈有两种方法。

  1. 堆栈可以取得所提供字符串的所有权。

    p->items[p->pos] = item;
    
  2. 堆栈可以复制所提供的字符串。

    p->items[p->pos] = strdup(item);
    

区别在于谁负责释放字符串。

【讨论】:

  • 谢谢,这实际上很有意义。虽然在模板代码中,他们使用了“int items”(只是用 int* 替换所有字符),但是当他们使用“p->items[p->pos”时它对他们有用] = 项目”。为什么它适用于 int 而不是 char?
  • 你不能在一个 int 中存储多个 int。
猜你喜欢
  • 2019-01-09
  • 1970-01-01
  • 1970-01-01
  • 2019-11-04
  • 2023-03-08
  • 2016-04-06
  • 2020-06-05
  • 1970-01-01
  • 2010-10-01
相关资源
最近更新 更多