首页 > 解决方案 > 如何处理C中的指针数组?

问题描述

就像我在循环中声明了一个指针数组并使用它通过扫描收集一堆字符串,但是在循环之后当我想打印出数组中的字符串时,我发现所有数组都被同一个字符串占用,这是我输入的最新一个。代码如下

#include<stdio.h>

int main(){

char *array[3];
char content[10];
int time;
scanf("%d",&time);

for(int i=0;i<time;i++){
  scanf("%s",content);
  array[i]=content;


}

for(int j =0;j<time;j++){
  printf("%s\n",array[j]);
}

return 0;}

标签: carrays

解决方案


在每次迭代中,输入流都被复制到content并且地址content存储在array. 因此content被一次又一次地覆盖,地址被复制到每个索引array

for(int i=0;i<time;i++){
  scanf("%s",content);
  array[i]=content; //Here every array[0..time] is assigned with address of content
}

简而言之,其行为如下,

在此处输入图像描述

您需要的是每次迭代的新存储位置,这些位置可以通过malloc堆动态分配,如下所示,

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

int main()
{
    int i;
    char content[10];
    int n;
    scanf("%d", &n);
    char*array[n];
    for (i = 0; i < n; i++) {
        scanf("%9s", content); //ensure no more than 10 letter added includeing '/0'
        char*c = malloc(strlen(content)); 
        if(c)
        {
            strncpy(c,content,strlen(content));
            array[i] = c;
        }
        else
        {
            exit(0);
        }
    }

    for (i = 0; i < n; i++) {
        printf("%s\n", array[i]);
    }

    for (i = 0; i < n; i++) {
        free(array[i]);
    }

}

或通过 VLA 如下,

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

int main()
{
    int i;
    int n;
    scanf("%d", &n);
    char*array[n];
    char content[n][10];
    for (i = 0; i < n; i++) {
        scanf("%9s", content[i]);
        array[i] = content[i];
    }

    for (i = 0; i < n; i++) {
        printf("%s\n", array[i]);
    }
}

推荐阅读