C中的字符串数组,奇怪的行为

C中的字符串数组,奇怪的行为,c,arrays,string,C,Arrays,String,我正在尝试解决一个关于代码游戏的难题。 以下是简单的代码: #include <stdio.h> int main(void) { char *hashTable[3]; for (int i = 0; i < 3; i++) { char EXT[101]; char MT[501]; scanf("%s%s", EXT, MT); fgetc(stdin); hashTabl

我正在尝试解决一个关于代码游戏的难题。
以下是简单的代码:

#include <stdio.h>    
int main(void) {
    char *hashTable[3];
    for (int i = 0; i < 3; i++) 
    {
        char EXT[101]; 
        char MT[501];
        scanf("%s%s", EXT, MT); fgetc(stdin);
        hashTable[i]= MT;
    }
    printf("%s\n",hashTable[0]);
    printf("%s\n",hashTable[1]);
    printf("%s\n",hashTable[2]);
}
#包括
内部主(空){
char*哈希表[3];
对于(int i=0;i<3;i++)
{
char-EXT[101];
char-MT[501];
scanf(“%s%s”,分机,MT);fgetc(标准输入法);
哈希表[i]=MT;
}
printf(“%s\n”,哈希表[0]);
printf(“%s\n”,哈希表[1]);
printf(“%s\n”,哈希表[2]);
}
例如,如果我键入:a\n b b\n c c\n
输出将是“c”而不是“a b c”。为什么最后一个值“c”会覆盖哈希表[0]和哈希表[1]。 使用以下代码,我收到了正确的输出:

#include <stdio.h>    
int main(void) {
    char *hashTable[3];
    char *hashTable2[3];
    hashTable2[0]="a";
    hashTable2[1]="b";
    hashTable2[2]="c";
    for (int i = 0; i < 3; i++) 
    {
        hashTable[i]= hashTable2[i];
    }
    printf("%s ",hashTable[0]);
    printf("%s ",hashTable[1]);
    printf("%s ",hashTable[2]);
}
#包括
内部主(空){
char*哈希表[3];
char*hashTable2[3];
哈希表2[0]=“a”;
哈希表2[1]=“b”;
哈希表2[2]=“c”;
对于(int i=0;i<3;i++)
{
哈希表[i]=哈希表2[i];
}
printf(“%s”,哈希表[0]);
printf(“%s”,哈希表[1]);
printf(“%s”,哈希表[2]);
}

您将指针指定给同一内存区域,因此将显示最后输入的值

MT是保留的501字节内存,您将用户输入的值放在那里,然后将MT的地址分配给哈希表[i]。然后将新值放入相同的501字节中,覆盖上一个字节

例如,假设MT[501]具有起始物理地址1000,因此每个哈希表元素将等于1000并指向同一内存。这就是为什么要打印相同的值


此外,由于您将变量声明为“auto”,它将在堆栈上分配。在块执行结束后,将调整堆栈指针,以便在下次分配时重用此内存。在块的末尾和打印之间并没有任何其他分配,这是因为它并没有被覆盖。否则,它将被下一次内存分配覆盖。

首先
EXT
MT
循环作用域中是本地的,它们不在该作用域之外。这是一个UB

其次,将相同的数组地址分配给
char*
数组的所有元素。退出循环时,此地址不再有效

您需要为所有元素分配内存:

for (int i = 0; i < 3; i++) 
{
    hashTable[i]= malloc( /*some size*/);
    if(hashTable[i])
        scanf("%s", hashTable[i]); /* just an example */
}
for(int i=0;i<3;i++)
{
hashTable[i]=malloc(/*some size*/);
if(哈希表[i])
scanf(“%s”,哈希表[i]);/*只是一个示例*/
}

数组
EXT
MT
for
包含块的本地数组;它们在终止
}
时不再存在

在块内,您将他们的地址放入
哈希表中


当您试图打印它们的内容时(记住此时数组已经不存在),您调用未定义的行为

此代码是否编译:
hashTable[hashFunction(EXT,N)],MT,hashTable[0]?你能提供一些吗?你的问题是什么?
哈希表[i]=MT
是一个问题:
MT
值在
for
循环中没有更改,因此
哈希表[0,1和2]
将具有相同的值,该值指向存储在
MT
中的最后一个值:
c
您需要理解代码,而不是发布“它不起作用,请帮助我”。了解。MT的存储持续时间是多少?了解。行
哈希表[i]=MT是什么做什么?
strcpy(哈希表[i],MT)
有什么不同吗?Stackoverflow不是一个学习网站,你可以找到。不对。任何东西都可能存储在那里,因为变量超出了范围。你重写了整个答案!增加了一些解释让我进一步解释。最初的问题是“为什么最后一个值“c”会覆盖哈希表[0]和哈希表[1]”。这是因为相同的指针分配给所有哈希表元素。这是我的答案,当然是正确的。每次SP移动时,分配相同的地址和相同的起始地址,然后分配给哈希表[i]。当然,在块结束后使用“auto”变量是错误的,所以我在后面添加了这个解释,尽管TS没有问这个问题。