我有一个工作的C程序,在编译时已知字符串数组的长度。它是:
char array_person_name[3][101];
char person_name[101] = "";
...
strncpy(person_name, "John Smith", strlen("John Smith")+1 );
for(i=0;i<3;i++)
{
sprintf(array_person_name[i], person_name );
}
当我使用gdb检查第一个元素时,它会读取(例如“John Smith”+空字符):
(gdb) p array_person_name[0]
$1 = "John Smith", '\000' <repeats 26 times>, "\003\000\t\000p\005\240 ?", '\000' <repeats 11 times>, "@\337\377\377\377\177\000\000\260\337\377\377\377\177\000\000\001\000\000\000\000\000\000\000\300\332\377\377\377\177\000\000\000\235\230Z5\000\000\000\260\337\377\377\377"
数组中的所有其他元素看起来都很相似。现在我需要修改这个程序,以便在运行时不知道数组大小时它可以工作,其结果需要与从上面的gdb打印的结果完全相同(除了null之后的字符可能不同)。这是我的代码:
char **array_person_name;
char person_name[101] = "";
...
strncpy(person_name, "John Smith", strlen("John Smith")+1 );
array_person_name = malloc(3 * sizeof(char*)); /* allocate memory for row pointers */
for(i=0;i<3;i++)
{
array_person_name[i] = malloc(101 * sizeof(char)); /* allocate memory for columns */
sprintf(array_person_name[i], person_name );
}
当我使用gdb检查第一个元素时,它显示为:
(gdb) p array_person_name[0]
$1 = 0x6cff30 "John Smith"
我不确定这两个程序的gdb输出之间的区别是什么,但无论有什么不同,对于共享库来说都足够了,它接受array_person_email
作为输入,以便正确执行第一个代码块,第二个代码块不正确。有没有办法修改我的第二个代码块,以便array_person_email
看起来与第一个代码块的结果相同?
答案 0 :(得分:1)
在第一个示例中,调试器打印出数组的所有字符,在第二个示例中,调试器没有大小,因此只打印以零结尾的字符串。
答案 1 :(得分:1)
GDB输出看起来不同的原因是因为在第一种情况下,array_person_name[0]
是一个数组,其大小在编译时是已知的,因此GDB努力显示它所知道的关于该数组的所有内容(即所有101个元素)。如果您改为p (char *)array_person_name[0]
,则只能获得数组的“相关”部分。
如果你的库函数表现出不同的行为,那么要么它被破坏了,要么你没有按照预期传递它(即它期望的不是char **
)。
答案 2 :(得分:1)
在两种情况下都没有初始化array_person_name [i]。
第一个版本获取堆栈,第二个版本获取堆。也许统计差异导致不同的行为。但是,您应该在两种情况下初始化
答案 3 :(得分:0)
而不是
p array_person_name[0]
尝试
ptype array_person_name[0]
并比较两个变量的类型。
你会发现它们不一样。
顺便说一句,我不得不说
strncpy(person_name, "John Smith", strlen("John Smith")+1 );
是一个错误,我想你的意思是:
strncpy(person_name, "John Smith", 101);