我有一个工作的 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
看起来与第一个代码块的结果相同?