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