C程序:在编译时知道长度与未知长度时匹配字符串数组

时间:2012-04-08 15:53:21

标签: c

我有一个工作的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 个答案:

答案 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);