无法将字符从指针复制到另一个指针(都分配了内存)

标签 c

我有一个程序可以从命令行使用 argv 接受字符输入。我使用 strcpy 将输入 argv[1] 复制到已分配内存的名为 structptr 的指针(它转到 structptr->struct 中的单词)。然后,我逐个字符地从指针 structptr 指向另一个名为 words 的指针的内存中复制,该指针指向已分配的内存。在我复制一个字符后,我打印该元素 [c] 以确保它已被正确复制(它有)。然后我完成所有字符的复制并将结果返回到一个字符指针,但由于某种原因它是空白/空的。每次复制字符后,我都会检查前面的元素是否正确,但它们不再出现([c-2]、[c-1]、[c])。这是我的代码:

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

struct StructHolder {
char *words;
};
typedef struct StructHolder Holder;

char *GetCharacters(Holder *ptr){
int i=0;
char *words=malloc(sizeof(char));
for(i;i<strlen(ptr->words);i++){
 words[i]=ptr->words[i];
 words=realloc(words,sizeof(char)+i);
}
words[strlen(ptr->words)]='\0';
return words;
}

int main(int argc, char **argv){

Holder *structptr=malloc(sizeof(Holder));
structptr->words=malloc(strlen(argv[1]));
strcpy(structptr->words, argv[1]);
char *charptr;
charptr=(GetCharacters(structptr));
printf("%s\n", charptr);

return 0;

最佳答案

起初我以为是这个问题:

char *words=malloc(sizeof(char)) 正在分配 1 个字节(sizeof 1 个字符)。您的意思可能是 char *words = malloc(strlen(ptr->words)+1); - 您可能希望对 ptr 及其成员进行 null 检查以确保安全。

然后我看到了realloc。您的 realloc 总是短 1 个字符。当 i = 0 时,您分配 1 个字节,然后进入循环,递增 i 并将 char 1 放在重新分配的数组末尾(索引 1 处)

此外,您在 main 中的 strcpy 还没有在 holder 中分配任何内存。

关于无法将字符从指针复制到另一个指针(都分配了内存),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18861583/

相关文章:

c - 错误 malloc() : memory corruption

c++ - makefile:如何正确执行 “ranlib”操作

c - 从文本文件输入

Java Out Of Band(称为 "urgent data")数据

c - 如何找到已知大小的数组的最大元素?

c - 如何读入数字作为命令参数?

c - 如何正确解决 -Wcast-qual

c - 如何在没有竞争条件的情况下将两个 32 位计数器读取为 64 位整数

c - 如何从多个命名管道接收消息?

将 char 数组的分段转换为 int