0

只是一个简单的程序来习惯指针。该程序应该以与读取内存的相反顺序将我的一部分内存的内容放入字符数组中。IE查看降序内存地址,我想将它按降序存储在字符数组中。

我的编译器一直告诉我:“赋值错误类型不兼容”

realloc函数就行了

我究竟做错了什么?在我看来,“反向”和realloc的结果都应该是指向 char 类型的指针?

我的代码:

int main(){
char  first[]="hello mark", strng='h', reverse[]="";
char* ptr=&first[10];
int i=0;
    while(ptr > (&strng-0xf4240)){
        printf("%c", *ptr--);
        reverse = realloc(reverse, (i++ * sizeof(char)));
        reverse[strlen(reverse)-i] = *ptr;
    }
printf("%s", reverse);
return 0;
}

谢谢!

编辑:对不起,我将这些错误发布为下面的评论

感谢帮助,第一条和第二条评论搞定了!我确实有所需的#include,我只是忘记将它们复制到堆栈溢出中。你是对的,现在我被困在非空终止的 strlen() 上。我会自己解决那个。再次感谢!

我说得太早了,编译好了,但是有逻辑错误。while 循环将执行一次。但是,无论 i 的初始值如何,后续循环仍然会失败。导致失败的行是调用 realloc 的行

4

3 回答 3

1

您不能重新分配一开始没有分配的内存。您应该将 reverse 声明为“char *”并从 malloc 开始。

这会让你继续前进,但你真的应该考虑以块的形式重新分配,而不是一次一个字节。哦,当您尝试 strlen 时,我没有费心解决“反向”可能不是空终止的事实 - 我将把它留给读者作为练习。

int main(){
char  first[]="hello mark", strng='h';
char* reverse;
char* ptr=&first[10];
reverse = (char*)malloc(1);
reverse[0] = '\0';
int i=0;
    while(ptr > (&strng-0xf4240)){
        printf("%c", *ptr--);
        reverse = (char*)realloc(reverse, (i++ * sizeof(char)));
        reverse[strlen(reverse)-i] = *ptr;
    }
printf("%s", reverse);
return 0;
}
于 2009-02-10T19:13:48.350 回答
0

任何一个:

  • 您正在使用 C++ 编译器编译 C 代码。这就是为什么它认为您需要将返回的 void*realloc转换为 char*。转换在 C 中是合法的。

或者

  • 您未能包含stdlib.h,因此编译器认为realloc返回int

编辑

再次阅读您的代码时,实际问题是您正在分配一个数组,该数组不允许出现在分配的 LHS 上(不是“左值”)。不过,您接受另一个答案很好。它有一些很好的建议。

于 2009-02-10T19:28:15.070 回答
0

您不能重新分配一开始没有分配的内存。

是的,绝对正确,因为为了重新分配,malloc 必须有一些关于您操作的内存块的附加信息(通过块分配表,或者存储在指针之前的 4 个字节中)。但你仍然可以写:

char * ptr1 = malloc(16);
char * ptr2 = ptr1 + 8;
ptr2 = realloc(ptr2,32);

而且你不会有编译器错误。不过,您仍然可能会在运行时遇到段错误。

但是,C 编译器处理的方式存在根本差异

char * tab = "toto";

char tab[] = "toto";

在第一种情况下,tab是一个指针,类型为 char *,并且像任何普通变量一样是一个左值。它可能大部分时间都驻留在寄存器中,或者可能是堆上的地址。在第二种情况下,tab 是一个数组,一个常量,因此不是左值。它可能在汇编级别被一个指向二进制可执行文件的文本部分的地址替换,字符串“toto”的数据所在的位置。

于 2009-02-11T02:49:44.587 回答