【发布时间】:2021-09-24 07:08:51
【问题描述】:
我在将字符串存储在 C 中的 **char 数组中时遇到问题。
似乎对于int 数组,当使用int_arr[idx] = 2 为索引分配值时,之前的索引保留了正确的值。
对于字符串数组char *str_arr[],如果我对str_arr[idx] = "hello" 进行类似的赋值,所有之前的索引也会被赋值
下面代码+输出的sn-p说明了问题:
代码:
#include <stdio.h>
#define MAX_LENGTH 10
void print_string_arr( char **arr )
{
for( int i = 0; i < MAX_LENGTH; i++ )
{
printf("%s, ", arr[i]);
}
printf("\n");
}
void print_int_arr( int *arr )
{
for( int i = 0; i < MAX_LENGTH; i++)
{
printf("%d, ", arr[i]);
}
printf("\n");
}
int main()
{
// String array
char *str_arr[MAX_LENGTH] = {0};
for(int i = 0; i < MAX_LENGTH; i++)
{
char tmp[MAX_LENGTH];
// Convert int to str
sprintf(tmp, "%d", i);
str_arr[i] = tmp;
print_string_arr(str_arr);
}
printf("\n");
// Integer array
int int_arr[MAX_LENGTH] = {0};
for(int i = 0; i < MAX_LENGTH; i++)
{
int_arr[i] = i;
print_int_arr(int_arr);
}
return 0;
}
输出:
String array:
0, (null), (null), (null), (null), (null), (null), (null), (null), (null),
1, 1, (null), (null), (null), (null), (null), (null), (null), (null),
2, 2, 2, (null), (null), (null), (null), (null), (null), (null),
3, 3, 3, 3, (null), (null), (null), (null), (null), (null),
4, 4, 4, 4, 4, (null), (null), (null), (null), (null),
5, 5, 5, 5, 5, 5, (null), (null), (null), (null),
6, 6, 6, 6, 6, 6, 6, (null), (null), (null),
7, 7, 7, 7, 7, 7, 7, 7, (null), (null),
8, 8, 8, 8, 8, 8, 8, 8, 8, (null),
9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
Integer array:
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 2, 0, 0, 0, 0, 0, 0, 0,
0, 1, 2, 3, 0, 0, 0, 0, 0, 0,
0, 1, 2, 3, 4, 0, 0, 0, 0, 0,
0, 1, 2, 3, 4, 5, 0, 0, 0, 0,
0, 1, 2, 3, 4, 5, 6, 0, 0, 0,
0, 1, 2, 3, 4, 5, 6, 7, 0, 0,
0, 1, 2, 3, 4, 5, 6, 7, 8, 0,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
我不确定为什么会发生这种情况以及如何解决它 - 非常感谢对为什么会发生这种情况的简明解释,以便我可以学会在未来的应用程序中避免它。
【问题讨论】:
-
并不是它们都有相同的字符串,而是相同的字符串pointer。实际的字符串数组被覆盖。
str_arr[i] = tmp;复制一个指针。 -
不仅如此,当您报告结果时,
char tmp[MAX_LENGTH];指向的字符串数组已经超出范围。