我的问题是我的程序仅在cad []中注册最后一个单词:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 4
void main()
{
char *cad[N];
for(int i=0;i<N;i++)
{
char word[100];
printf("Escribe algo : ");
scanf("%s",word);
cad[i] = (char*)malloc((strlen(word)+1)*sizeof(char));
cad[i] = word;
}
for (int i = 0; i < N; i++)
printf("%s\n",cad[i]); //just print the last word registered
}
例如,如果cad[1] = "Hello", ...cad[n] = "Yea"
的意思是所有单词都记录在各自的字段中,但是当我printf
从cad
到0
的所有n-1
时,所有cad[i]
都记录了最后一个词是"yea"
。
问题是什么,我该如何解决?
word
变量分配在堆栈上,并经过优化,可在每次读取单词的循环中重用。
具有上述说明,您正在用word
的地址覆盖分配的内存地址,因此您只需要丢弃分配的内存即可。因此,cad
中的每个元素都将指向word
地址,该地址将保存最后读取的字。
您需要做的是通过使用strcpy
功能在分配的空间中复制单词的内容:
strcpy(cad[i], word);
另外,一个好的做法是在完成使用m [m]后分配内存free
:
for (int i = 0; i < N; i++)
{
free(cad[i]);
}
问题是您正在分配cad[i] = word
,而不是将单词复制到上一条指令中分配的内存中。
尝试进行以下调整。
void main()
{
char *cad[N];
for (int i=0; i<N; i++)
{
char word[100];
printf("Escribe algo : ");
scanf("%s",word);
cad[i] = (char*) malloc((strlen(word)+1)*sizeof(char));
strcpy(cad[i], word); // Copy word into cad[i]
}
for (int i = 0; i < N; i++)
{
printf("%s\n",cad[i]);
free(cad[i]); // Also free allocated memory
}
}