只是一个简单的程序,以获得用于指针。该程序应该把内容的一部分的我的记忆变成一个字列在相反的顺序如何的记忆是阅读。E.I.看着下降的存储地址,并且我想要存放它的顺序在一个字阵列。

我的编译器不断告诉我:"不相容的错误类型,在分配的"

上线的 重新分配 功能

我做错了什么?我在我看来,这两种"反向",并将结果 重新分配 应该指针,以型炭?

我的代码:

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;
}

谢谢你!

编辑:对不起,我误公布这些意见,下面

谢谢你的帮助,第一和第二个意见得到了它!我没有所需的#包括,我只是忘了它们复制成堆的溢出。你是对的,现在我被困在非空终止strlen().我会解决一个对我自己的。再次感谢!

我说话太快,它编制好吧,但是有一个逻辑错误。虽然循环将执行一个时间。然而,随后循环仍然失败,无论初始价值i。线路,会导致失败的行调用分配

有帮助吗?

解决方案

可以不realloc的,这不是在首位malloc内存。你应该申报反向为“焦炭*”和malloc的,开始时使用。

这将让你去,但你真的应该想想在一个时间reallocing在块,而不是一个字节。哦,我没有刻意去解决一个事实,即“反向”恐怕不是空值终止的,当您尝试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;
}

其他提示

无论是:

  • 你是汇编C码 C++编译器。这就是为什么它认为 你需要投void*返回 通过 realloc 一char*.的 转换将是合法的,在C。

  • 你没有包括 stdlib.h, ,因此认为编译器 realloc 返回 int

编辑

在读你的代码再次,实际的问题是,你是分配到一系列,这是不允许出现在左轴的转让(不是一个'左值').这是很好的,你接受了其他的答案,虽然。它有一些很好的建议。

  

可以不realloc的,这不是在首位malloc内存。

是的,绝对是真实的,因为为了重新分配,malloc的有有有对你的内存处理大块一些其它附加信息,(通过块alocation表,或存储在4个字节的只是你的指针之前)。但你仍然可以写:

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

和你不会有一个编译器错误。你还可能会得到在运行时内存设计缺陷,虽然。

但是,在方式的根本区别一个C编译器将

char * tab = "toto";

char tab[] = "toto";

在第一种情况下,标签是指针类型char *的,并且像任何正常变量左值。它可能驻留在寄存器中的大部分时间,也可以是在堆上的地址。 在第二种情况下,标签是一个数组,一个常数,并且因此不是左值。它可能是在装配水平通过指向您的二进制可执行文件,其中对于字符串“TOTO”数据驻留的文本部分的地址替换。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top