只是一个习惯于指针的简单程序。该程序应该将内存的一部分内容放入字符数组中,其顺序与读取内存的方式相反。 I.E.查看降序内存地址,我想在字符数组中按降序存储它。
我的编译器一直告诉我: “分配错误不兼容的类型”
在 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;
}
谢谢!
编辑: 对不起,我将这些错误发布为以下评论
感谢您的帮助,第一次和第二次评论得到了它!我确实有所需的#includes,我只是忘了将它们复制到堆栈溢出中。你是对的,现在我被困在非空终止的strlen()上。我会自己解决这个问题。再次感谢!
我说得太早了,编好了,但是有一个逻辑错误。 while循环将执行一次。但是,无论i的初始值如何,后续循环仍然会失败。导致失败的行是调用realloc的行
答案 0 :(得分:1)
您无法首先重新分配未被malloced的内存。你应该将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;
}
答案 1 :(得分:0)
或者:
realloc
到char *。该
转换在C中是合法的。或
stdlib.h
,因此编译器认为realloc
返回int
修改强>
再次读取代码时,实际问题是您正在分配一个数组,该数组不允许出现在赋值的LHS上(不是'左值')。不过,你接受了另一个答案,这很好。它有一些很好的建议。
答案 2 :(得分:0)
您无法首先重新分配未被malloced的内存。
是的,绝对正确,因为为了重新分配,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”的数据位于其中。