在我的代码中,我试图从用户那里获取字符串作为输入,并将它们存储在指针数组中。但是,我的代码只存储指针数组所有元素中最后输入的字符串。我必须做什么修改?
我的代码是:
#include <stdio.h>
#include <string.h>
void main()
{
char *names[ 4 ], name[ 10 ];
for ( int i = 0; i < 4; i++ ) {
printf( "Enter your name: " );
scanf( "%s", name );
names[ i ] = name;
}
for ( int i = 0; i < 4; i++ )
printf( "\n* %s", names[ i ] );
}
输出为:
请输入您的姓名:请输入您的姓名:请输入您的姓名:请输入您的姓名:雅各布
- 雅各布
- 雅各布
- 雅各布
- 雅各布
1条答案
按热度按时间nhhxz33t1#
浅拷贝与深拷贝:
给定两个指针p和q,语句:
不将
q
指向的内存内容复制到p
指向的内存内容。它复制指针值,以便p
和q
现在都指向同一内存,并且通过p
对内存所做的任何更改都会在使用q
时反映出来。这称为浅复制。该声明
声明一个指向
char
.NB的4个指针的数组,该数组仅为指针分配内存。然后,在循环中:
将缓冲区
name
的地址分配给数组中的每个指针。name
的内容是什么?在内存中,它看起来像这样:
解引用并打印这些指针的内容,然后每次打印
Jacob
。malloc
为字符串分配内存,并将它们的地址赋给指针,然后可以使用strcpy
或POSIX的strdup
将缓冲区name
的内容复制到每个指针所指向的内存区域(这被称为深度复制)。strdup
使用malloc
为字符串分配内存,所以不要忘记使用free
。strdup()函数返回一个指向新字符串的指针,该字符串是字符串s的副本。新字符串的内存是通过malloc(3)获得的,并且可以通过free(3)释放。
main()
的定义不正确来自C11:
在程序启动时调用的函数名为main。实现没有为这个函数声明原型。它应该用int返回类型定义,并且没有参数:
或者使用两个参数(这里称为argc和argv,尽管可以使用任何名称,因为它们对于声明它们的函数是局部的):
或同等产品;或以一些其它实施方式定义的方式。
缓冲区溢出漏洞:
相当于:
它会继续读取输入并使缓冲区溢出。
相反,请考虑使用
fgets
:fgets
最多读取n - 1
个字符,并以null结束字符串。或者将宽度说明符与
scanf
一起使用: