1

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

4

4 回答 4

1

在第一个示例中,调试器打印出数组的所有字符,在第二个示例中,调试器没有大小,因此仅打印以零结尾的字符串。

于 2012-04-08T16:02:55.203 回答
1

GDB 中的输出看起来不同的原因是因为在第一种情况下,它array_person_name[0]是一个在编译时知道其大小的数组,因此 GDB 努力显示它所知道的关于该数组的所有内容(即所有 101 个元素)。如果你这样做p (char *)array_person_name[0],你只会得到数组的“相关”部分。

如果您的库函数表现出不同的行为,那么要么它已损坏,要么您没有传递它所期望的(即它所期望的不是 a char **)。

于 2012-04-08T16:03:01.957 回答
1

array_person_name[i] 在这两种情况下都没有初始化。

第一个版本采用堆栈,其次是堆。也许统计差异会导致不同的行为。但是,您应该在这两种情况下进行初始化

于 2012-04-08T16:04:01.627 回答
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);
于 2012-04-08T16:44:46.183 回答