从类型'array *'分配类型'array [256]'时不兼容的类型

时间:2013-10-06 09:45:15

标签: c

我对C很新,所以为了学习它,我试图创建一个输出龙曲线的程序。 这是我到目前为止所得到的:

#include <stdio.h>
#include <string.h>
#define ebene 5

char str_n[ebene-1];
char tmp[256]; // ="1"; // 1=R, 0=L
char text[256];

int a_index=0;


char switch_middle(char iarray[256]) {
    int num=((2^a_index-1)-1)/2+1; // Nummer der Zahlen pro ebene |-1|/2|+1 -> Index des mittleren Buchstaben
    if(num>=0) {
        iarray[num]='0';
    } else {
        iarray[0]='\0';
    }
}

int main() {
    printf("Hauptschleife erreicht");

    while(a_index<ebene) {
        //snprintf(text, sizeof text, "%s1%s", tmp, switch_middle(tmp));
        strcpy(text, tmp);
        strcpy(text, "1");
        strcpy(text, switch_middle(tmp));   // Error occures here!

        //str_n[a_index]=text;
        for(long i=sizeof(tmp)/sizeof(tmp[0]); i--; ) {
                tmp[i]=text[i];
            }
        printf("Ebene: %d\n", a_index);
        //printf("  Wert: %s", str_n[a_index]);
        printf("    Wert: %d\n", text);

        a_index++; // für Mathefunktionen
    }
}

尝试编译这会给我一堆警告和一个错误;我在这个问题的标题中提到的那个(从类型'char *'分配类型'char [256]'时不兼容的类型)。 是的。任何帮助将不胜感激(:

*编辑:好的,下面的评论解决了大部分问题;现在只剩下一个警告,即“传递参数2''strcopy'使得指针来自整数而没有强制转换'和”期望'const cgar * restrict'但参数类型为'char'“作为包含的注释string.h。当我尝试运行该程序时,它给了我一个内存访问错误。我在上面的代码中标记了这些行。

*编辑²:固定。谢谢以下所有人(:

3 个答案:

答案 0 :(得分:3)

您无法在C中分配数组。您有两个选项可以达到您想要的效果:使用memcpy()函数(它在标准库中,只是#include <string.h>),或者自己编写代码:

for(long i = sizeof(tmp)/sizeof(tmp[0]); i--; ) tmp[i] = text[i];

请注意,我计算了要复制的数据量,而不仅仅是硬编码256,以便在您想要更改所涉及数组的大小时防止将来出现错误。一般来说,应该以几乎所有成本避免固定限制。

编辑:有关复制数组的第三种方法,请参阅Aarons评论。


背景资料:

您可能想知道错误消息的文本,它会报告类型不匹配,您尝试分配两个相同类型的变量。原因是数组标识符几乎在所有上下文中都衰减为指向数组第一个元素的指针。这就是为什么你的作业右侧朽烂为char*,而左侧仍为char[256]类型。

答案 1 :(得分:1)

这一行

 tmp=text; is wrong.   

您正在尝试更改数组的基址(tmp),这是一个常量指针。这意味着无法更改数组的基址。这就是它抛出此错误的原因。 并且警告是因为您正在尝试在字符位置分配字符串。 这一行

   iarray[num] = "0"; 

“0”是一个字符串。尝试使其为'0'。现在它是一个字符。因此会有 没有警告。

    iarray[0] = ""; //Same reason

答案 2 :(得分:1)

char switch_middle(char iarray[256]) {

应该是

char * switch_middle(char iarray[256]) {

你应该在最后返回数组:

char * switch_middle(char iarray[256]) {
    int num=((2^a_index-1)-1)/2+1; // Nummer der Zahlen pro ebene |-1|/2|+1 -> Index des mittleren Buchstaben
    if(num>=0) {
        iarray[num]='0';
    } else {
        iarray[0]='\0';
    }
    return iarray;
}

=====

另外,C阵列有一些奇怪的功能。例如,它们在函数的参数列表中被忽略。 char * switch_middle(char iarray[256]) {完全等同于char * switch_middle(char * iarray) {,后者更具可读性。

这很奇怪,请参阅示例here on ideone

实际上,括号内的数字完全被忽略 - 你可以将它从256改为任何其他数字,程序不会改变行为!此规则仅适用于函数的参数。在局部变量中,数字确实意味着什么。

这意味着您无法直接将数组传递给函数。是的,外部函数可以发送数组,但接收函数不会将其视为数组。坦率地说,我认为这在C中是一个糟糕的设计。我认为如果[]出现在这样的参数列表中,编译器应该发出警告。