关于C ++的简单一般问题

时间:2011-05-01 09:42:01

标签: c++ arrays char autoit

我已经从autoit转移,现在正在学习C ++,并且一些问题不断出现。

第一个是存储字符输入。问题是我不知道文件的那一行有多少个字符(如果你正在读取文件)或者用户要键入多少个字母(在控制台应用程序中)。

解决这个问题的最佳方法是什么?我听说过字符串类,但是我想避免它,因为我不知道它是如何工作的,这会导致vunerabilities等。

...其次

在C中,您可以将shellcode加载到内存中,创建函数指针并执行该代码。 在C ++中是否有任何机制???

...第三

解释器如何迭代字符串输出的char数组? (char array [3];)编译器是否跟踪数组的大小,或者只是继续从内存中读取,直到它达到\ 0的东西???

...最后

如果Char *只是指向内存中数据的指针,那么为什么:

char * title =“节目标题”;

这项工作???存储在内存中的字符串文字在哪里?它是如何引用的?

非常感谢你。非常感谢你的帮助。

-Hyperzap

2 个答案:

答案 0 :(得分:2)

  1. 投入时间学习std :: string非常值得,因为它会给你带来很多麻烦。如果您不想利用C ++中的功能,那么为什么要使用C ++而不仅仅是C?
  2. 您可以像使用C一样使用相同的代码。
  3. 是的,C风格字符串输出的iostream输出直到终止为零。再一次,如果你使用std :: string,你不必关心这些细节。
  4. 如果我错了,请纠正我,但我认为title将是const char[]存储在堆栈中。
  5. 示例:

    const char* hello = "Hello\0World";
    cout << hello; // Prints only "Hello", i.e. up to terminating zero (\0)
    

    这是有效的原因:

    const char* hello = "Hello world";
    cout << hello;
    

    是因为hello 确实 "Hello world\0"; - 换句话说,编译器会插入终止零。

    请注意,std::string没有任何魔力。它也会读到终止零点:

    string hello = "Hello\0World\n";
    cout << hello; // Still only gives "Hello"
    

答案 1 :(得分:0)

char* title = "String Literal"有效,因为编译器会预先分配一个内存位置来存储字符串文字,因此您可以返回指向此内存位置的指针。 在c ++中,您在编译时知道其大小的数组(如示例中所示:char array[3]本身就是一个类型,因此编译器会跟踪大小。但是,如果您不知道大小(即char array[]),它只是一个指向char的指针。但是,你应该在c ++中使用std::vector(更好的安全性和性能)。 我不太确定你的其他两个问题(不太了解它们)