将字符复制到char指针数组时的堆栈转储

时间:2010-08-18 10:40:01

标签: c pointers

gcc 4.4.3 c89

我有以下源文件。

但是,我在以下行获得了堆栈转储:

printf("dest: %d [ %s ]\n", i, dest[i]);

原因是如果未能从for循环中断。我已经在for循环中尝试了不同的条件,以便在打印之前尝试打破。

i != NULL
i != '\0'
i != 0

然而,以上所有都无法奏效。我可以使用sizeof(src)作为条件。但我只想知道为什么我使用当前的方法获得此堆栈转储。

当我使用gdb检查时,所有数组元素都已初始化为nul:

(gdb) p dest
$8 = {0x0 <repeats 11 times>}

源代码:

void copy_characters()
{
    /* static character array */
    char src[] = "sourcefile";
    /* array of pointers to char */
    char *dest[sizeof(src)] = {0};
    size_t i = 0;

    /* Display the source characters */
    for(i = 0; src[i] != '\0'; i++) {
        printf("src [ %c ]\n", src[i]);
    }

    /* Copy the characters */
    for(i = 0; i < sizeof(src); i++) {
        dest[i] = &src[i];
    }

    /* Display them */
    for(i = 0; dest[i] != '\0'; i++) {
        printf("dest: %d [ %s ]\n", i, dest[i]);
    }
}

非常感谢任何建议,

3 个答案:

答案 0 :(得分:3)

for(i = 0; i < sizeof(src); i++) { 
    dest[i] = &src[i]; 
}

应该是

for(i = 0; i < sizeof(src); i++) { 
    dest[i] = src[i]; 
}

您不需要源字符的地址......

修改

如果你确实需要这些地址,你不能指望它们被零终止,因为你已经覆盖了所有地址(最后一个地址为 src的零字节)。 只需循环直到i == sizeof(dst)/sizeof(*dst)

答案 1 :(得分:3)

首先 - 我不确定你在这里要做什么。但是:

dest[i]是一个指向角色的指针。

您应该测试dest[i]指向的值是否为空,如:

for(i = 0; *(dest[i]) != '\0'; i++) {

答案 2 :(得分:1)

更改

for(i = 0; dest[i] != '\0'; i++) {
    printf("dest: %d [ %s ]\n", i, dest[i]);
}

for(i = 0; i < sizeof(src); i++) {
    printf("dest: %d [ %s ]\n", i, dest[i]);
}

因为dest数组中总共有“sizeof(src)”元素。

如果你测试'\ 0',你会得到一个运行时错误,因为你测试指针是否等于'\ 0'(零),这不是这种情况。

解决此问题的另一种方法(针对此特定功能)是将循环更改为

for(i = 0; *dest[i] != '\0'; i++) {
    printf("dest: %d [ %s ]\n", i, dest[i]);
}

因为你希望dest的最后一个元素指向字符串的最后一个字符,即'\ 0'。

我会选择第一个解决方案,因为它更通用(你迭代'数组的大小'次)。