在C编程中,我们无法使用scanf()函数获取值到指针数组
int main() { char *names[6]; int loop; scanf("%s",names[1]); printftf("n%s",names[1]); }
它正在工作,当我把输入作为程序,我认为它是存储输入,但它正确打印输出作为给定的输入。之后,它给出了分段错误…但是当我在循环中做同样的得到6个字符
int main() { char *names[6]; int loop; for(loop=0;loop<6;loop++) scanf("%s",names[1]); for(loop=0;loop<6;loop++) printf("n%s",names[1]); }
它不工作请给我答案……
问题是您没有为这些名称分配任何空间。 如果要将其与scanf
一起使用,则需要初始化数组中的每个元素。
char* names[6]; for( int i = 0; i < 6; ++i ) names[i] = malloc( 256 * sizeof *names[i] ); // or some other max value scanf( "%s", names[1] );
否则这些指针将指向您内存中的任何位置,并且尝试读取/写入这些位置最终将导致分段错误 。
在你的代码names
是一个由6个指针组成的数组。 现在,每个指针都可以存储新字符串的起始点(第一个字符的地址)。 这意味着您可以在names
变量中存储6个不同字符串的起始地址。
但是当你使用循环来初始化每个字符串时,你需要通知机器每个字符串可能的长度,以便它可以分配一个连续的地址块,其第一个地址可以存储在指针中以引用你的串。 因此,您必须分配一个您认为足以存储字符串的特定大小(例如:256字节,1字节为1个字符)。 如果没有这个,机器不知道在哪里存储字符串的所有字节,并由于非法内存访问而引发分段错误。
因此,为此,必须为每个6个指针分配一些空间来存储字符串。 这将使用malloc()
在您的循环中完成。 基于@ K-ballo的代码:
char* names[6]; int max_length = 256; // The maximum length you expect for( int i = 0; i < 6; ++i ) names[i] = malloc( max_length * sizeof(char) ); // allocates max_length number of bytes scanf( "%s", names[1] );
所以现在你基本上有6个不同的max_length
连续char地址块,每个地址都由names[i]
引用。 当你执行scanf()
它会从标准输入中读取字节,然后将这些字节放入由名称[1]引用的内存中的这些分配字节中。
我在开始时很难理解这一切,所以只是想一个精心的解释会有所帮助。 ?
以上就是c/c++开发分享字符串指针数组相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/562428.html