arrays - 为什么我的指针(“char *item”)变量被视为常规变量(“char item”)?
问题描述
我有一个存储变量的堆栈实现: 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;
}
}
问题出在我的推送方法中,我既不能使用 strcpy() 也不能只将 char 分配给 p->items[p-pos] 而不说“从不兼容的类型 char * 分配 char”,但取消引用“item”只会给我第一个字符,我想要整个“字符串”。
为什么会发生这种情况,我该如何解决?
解决方案
p->items
是 a char*
,p->items[...]
a 也是char
。strcpy
期望 a char*
,因此您提供的内容与需要的内容不匹配。
不仅如此,它还期望指针指向包含要复制的字符串的足够字符中的第一个。您甚至没有尝试获取 指向的字符串的长度item
,更不用说为它分配足够的内存了。
我想你想要一堆字符串。如果是这样,我们需要一个指针数组(char *items[]
)或一个指向内存块的指针(char **items
)。后者在这里更简单。像这样,
char *items;
应该
char **items;
它将使用
malloc(sizeof(char*) * size)
将字符串添加到堆栈有两种方法。
堆栈可以获取提供的字符串的所有权。
p->items[p->pos] = item;
堆栈可以复制所提供的字符串。
p->items[p->pos] = strdup(item);
区别在于谁负责释放字符串。
推荐阅读
- c# - EF Core - 复合主键删除一个索引
- java - 正则表达式没有从模式中删除下划线
- apache-kafka - Spring Cloud Stream Kafka Stream 加入后未写入目标主题
- javascript - 在数组中搜索对象
- android - 是否可以从 Fabric 迁移到 Firebase Crashlytics 中删除 Fabric apiKey?
- google-cloud-storage - gsutil 是否支持从 Azure 存储复制文件?
- c# - 调用 Deserialize 方法时,Jil 是否可以选择将空字符串转换为 null?
- sql-server - SQL Server PATINDEX 有时会返回错误的找到索引
- regex - 如何创建正确的 RegEx 模式来识别“,”(或之前和之后)之间的值?
- c - C: 通过 HTTP 请求将文件上传到 Google Drive 的错误 408 响应