简单的C代码,带有令人烦恼的“分配中不兼容的类型”错误

时间:2009-02-10 19:11:01

标签: arrays variable-assignment realloc

只是一个习惯于指针的简单程序。该程序应该将内存的一部分内容放入字符数组中,其顺序与读取内存的方式相反。 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的行

3 个答案:

答案 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)

或者:

  • 您正在使用a编译C代码 C ++编译器。这就是它的思考原因 你需要转换返回的void * 通过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”的数据位于其中。