【问题标题】:Pointers - single strings versus string arrays指针 - 单个字符串与字符串数组
【发布时间】:2014-08-11 05:13:26
【问题描述】:

这是一个关于指向字符串的指针与指向字符串数组的指针(复数)的问题。这是代码 - 请参阅 cmets 了解问题:

int main(int argc, char** argv) {

    // Here, we're just loading each string into an incrementing pointer and printing as we go. It's not an array of pointers. This works fine.

    char* dumb = NULL;
    cout << argc << endl;
    for (int i = 0; i < argc; i++) {
        dumb = argv[i];
        cout << dumb << endl;
        dumb++;
    }

    // Next we'll try to load the strings into an array of pointers, and print them out. This causes an error (see below).

    char** dumber = NULL;
    cout << argc << endl;
    for (int i = 0; i < argc; i++) {
        *(dumber + i) = argv[i];
        cout << dumber[i] << endl;
    }

    return 0
}

Testing.exe 中 0x001899F7 处未处理的异常:0xC0000005:访问冲突写入位置 0x00000000。

有人可以纠正我吗?

【问题讨论】:

  • 您正在尝试取消引用空指针dumber。我不知道你期望什么样的结果。
  • 这段代码dumb++;什么都不做——你已经为argv[i]增加了i,所以把dumb++;放在最后对你的代码没有影响(它实际上只是增加了最后一个argv[i] 指针加 1,但无论如何你都要重新分配指针)
  • n.m.我希望你不要粗鲁。我是这方面的初学者!
  • 这是关于基本概念的,但这是一个很好的问题,学习就是这样发生的。

标签: c++ pointers


【解决方案1】:

你的指针数组在哪里?

char** dumber =NULL;

只是指向“char 指针”的指针,而不是指针数组。 你需要

char** dumber = new char*[argc];

【讨论】:

  • 请不要忘记将其标记为答案然后@user3885616
【解决方案2】:

将这一行添加到代码中:

dumber = malloc(100); //   adjust the size as per your requirements 

由于您没有为“笨蛋”分配任何空间,因此每次您尝试
写一个新字符串,你写在位置 0x00000000,写在这个
位置导致访问冲突,因为不允许任何进程写入此地址。
这个地址是专门为空指针保留的。

【讨论】:

  • 问题被标记为“C++”
  • @Abhineet 那又怎样? malloc() 是合法的 C++
  • @ChrisStratton:: 是的,但恕我直言,我认为new 会更好。
【解决方案3】:

这就是我最终的结果。也许它会对其他新秀有所帮助,所以我想 我会发布它。它通过释放分配给更笨的数组的内存来完成,我知道这是一件好事。

#include <iostream>
using namespace std;

int main(int argc, char* argv[]) {
// int main(int argc, char** argv) { // An alternative.

    // Just loading each string into the same pointer and printing as we go.
    // It's not an array of pointers.
    char* dumb;
    cout << argc << endl;
    for (int i = 0; i < argc; i++) {
        dumb = argv[i];
        cout << dumb << endl;
    }

    // Next we'll load the strings into an array of pointers, and print them out.
    char** dumber = new char* [argc];
    cout << argc << endl;
    for (int i = 0; i < argc; i++) {
        *(dumber + i) = argv[i];
        cout << dumber[i] << endl;
    }

    // Deallocate the memory dynamically assigned by the 'new' operator for the
    // pointer array.
    delete[] dumber;
    dumber = 0;

    cin.get();
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-29
    • 2021-04-21
    • 1970-01-01
    • 2011-03-13
    • 2020-11-04
    • 1970-01-01
    相关资源
    最近更新 更多