【问题标题】:String array in C has the newest value for all indicesC中的字符串数组具有所有索引的最新值
【发布时间】: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]; 指向的字符串数组已经超出范围

标签: arrays c string list


【解决方案1】:

数组char tmp[MAX_LENGTH]; 是非静态的并且在其范围内是本地的。这意味着它会在退出范围时消失,并在再次进入范围时重新创建(在循环的下一次迭代中)。

因此,像str_arr[i] = tmp; 这样分配指向数组的指针是没有用的。 您应该复制字符串并分配一个指向副本的指针。

如果您的系统支持 [strdup()]:

#include <string.h>

...

str_arr[i] = strdup(tmp);

如果不支持或者您只想使用标准函数:

#include <stdlib.h>
#include <string.h>

...

str_arr[i] = malloc(strlen(tmp) + 1); /* +1 for terminating null-character */
if (str_arr[i] == NULL) exit(1); /* check if allocation succeeded */
strcpy(str_arr[i], tmp);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-01
    • 2013-11-04
    • 1970-01-01
    • 2021-04-16
    相关资源
    最近更新 更多