c - 如何处理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;}
解决方案
在每次迭代中,输入流都被复制到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]);
}
}
推荐阅读
- c# - Ext.NET HyperlinkColumn 不显示
- sql-server - while循环问题,从期间计算天数
- python - 从 docx 文件中删除字符
- authentication - 如何读取登录时间 - 更改座位位置的通知
- arrays - 如何从二维数组中减去两个子数组
- java - 如何使用 engine.load() 加载下一个 URL
- amazon-web-services - 当来自 AWS API Gateway 的 API 超时或出现错误时发送 Slack 警报
- java - JOOQ:在通用界面中对来自不同表的列进行逻辑分组
- c# - C# .Net 使用某些 PixelFormat 调用 Graphics.FromImage(myBitmap) 会引发内存不足异常
- javascript - 无法将 javascript 从 html 文件移动到 js 文件并将其导入 application.js - rails