值不为数组的第二个元素打印

时间:2014-11-07 09:16:51

标签: c

int main()
{
    char *a1[10] = {"123","121"};
    int i =0;
    char *a=NULL;
    for(i=0;i<2;i++)
    {
        a=strcat(a1[i],"0000");
        printf("values %s",a);

    }
}

此代码的输出就是这样 $ ./a.exe 值1230000值0000000

但它应该是 $ ./a.exe 值1230000值1210000

请告诉我我错在哪里

2 个答案:

答案 0 :(得分:6)

你想要一个char数组的数组,但char *a1[10]是一个指向char的指针数组(通常放在只读段/字符串文字中),试图修改一个字符串文字通常会导致分段错误。

更改

char *a1[10] = {"123","121"};    /* Array of string literals (read only) */

char a1[][10] = {"123","121"};  /* Array of array of char (read - write) */

答案 1 :(得分:3)

问题是真正修改了字符串。但行

char *a1[10];

影响一个10 char *的数组,而不是指向我认为OP所期待的char[10]数组的指针(如Jdamian评论中所述)。

要创建char[10]数组,您必须写:

char a1[][10] = {"123","121"};

这样,您创建了一个2 char[10]的数组,分别初始化为"123"(事实上,{ '1', '2, '3, '\0', '\0', '\0', '\0', '\0', '\0', '\0'},因为它是真的 a {{1} })和&#34; 121&#34;;

通过这种方式,您可以安全char[10] strcat"0000",因为3(初始长度)+ 4(添加长度)+ 1(终止空)给出8 <= 10。 / p>

但真正安全的方法是:

a1[i]