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]);
}
}
非常感谢任何建议,
答案 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'。
我会选择第一个解决方案,因为它更通用(你迭代'数组的大小'次)。