【问题标题】:Passing a char pointer to another function将 char 指针传递给另一个函数
【发布时间】:2018-09-16 19:39:54
【问题描述】:

我研究了半天,不知道如何传递一个简单的 char 指针,并修改函数中的值。大多数解决方案都说要修改函数以接受char ** 参数。

我有一个无法修改的功能。我需要传递一个 char 指针给它,因为这个函数会给我一个新的计算 char 值。有人告诉我我可以传递一个指向 char 数组的指针,它会起作用,但我不确定如何去做。

Passing char pointer as argument to function

我按照上面的帖子提出了以下代码,但它仍然无法正常工作。当我将指针传递给 char arr[] 时,它不会改变它的值。我的目标是传递一个 char 指针,并能够通过传递它的引用在另一个函数中写入它。任何帮助表示赞赏。

enum STATUS {
    OK = 0,
    BAD = 1,
};

STATUS func1(char *pData)
{
    pData = "Hello World";

    cout << pData << endl;

    return OK;
}

int main()
{
    STATUS ret;
    char arr[] = "Example String";
    char* pArray = &arr[0];

    ret = func1(pArray);

    cout << arr << endl;
    cout << pArray << endl;


    getchar();

    return 0;
}

【问题讨论】:

  • 如果您使用的是 C++,请尝试并实际使用 C++。那是使用const string 而不是char*
  • 函数func1是别人做的,不能修改。如果我将变量声明为 const 字符串,我将需要修改 func1()
  • 哦,这是那些 C++课程中完全没有抓住重点的吗?祝你好运,我希望你做得好,但请记住,这与 C++ 的实际意义相去甚远。

标签: c++


【解决方案1】:
 STATUS func1(char *pData)
 {
     pData = "Hello World";
     cout << pData << endl;
     return OK;
 }

该函数正在执行浅拷贝(即更改指针pData 的值,而不是它指向的值)。您需要将新字符串深拷贝pData指针指向的内存中。

对字符串进行深拷贝的传统方法是使用strcpy() 库调用。你也可以使用循环。

【讨论】:

  • 让我们忘记 func1(char *pData) 在做什么,而是这个函数需要一个 char 指针。我想弄清楚如何在不修改任何内容的情况下将 char 指针传递给 func1。
  • 在这种情况下,您正确地通过了它,但您的测试是错误的。它失败并出现 II 类错误。
【解决方案2】:

我有一个无法修改的功能。我需要向它传递一个 char 指针,因为这个函数会给我一个新的计算 char 值。有人告诉我我可以传递一个指向 char 数组的指针,它会起作用,但我不确定如何去做。

那不是真的。说这话的人是在骗你,或者他们对主题一无所知。


当你使用

pData = "Hello World";

您正在修改pData 指向的位置。但是,该更改是函数的本地更改。它不会更改调用函数中的数据。您可以使用std::strcpy 进行更改以影响调用功能。

std::strcpy(pData, "Hello World");

您可以通过引用传递指针并更改指针的值。这将使调用函数可以看到更改。

STATUS func1(char*& pData)
{
    pData = "Hello World";

    cout << pData << endl;

    return OK;
}

但是,当您这样做时,main 中的 arrpArray 将有所不同。 arr 将继续具有相同的值,而 pArray 将指向一个完全不同的值。

【讨论】:

  • 这应该行不通,因为pArray 指向const char*,当你重写它时,这是各种错误
  • 即使它“允许”它,也可能是未定义的行为。没有gcc --yolostrcpy 就不会是你想要使用的东西。
  • @tadman,我认为我们沟通不畅。在main 中,OP 使用的是char arr[] = ...。这是可以修改的。
  • 记住我不能修改 func1(char* pData) 函数
  • @JC203,在这种情况下,使用std::strcpy 是正确的解决方案。
【解决方案3】:
STATUS func1(char *pData)
{
  *(pData) = "H";
  *(pData+1) = "e";
  *(pData+2) = "l";
  *(pData+3) = "l";
  //... etc ...

  cout << pData << endl;

  return OK;
}

这是更改指针指向的内存,而不是指针本身。使用其他答案中的功能可以做得更好,但这更明确。如果您使用的 IDE 允许单步调试和内存查看,您可以观察内存中各个字节的变化。

如果初始内存缓冲区不够大,这可能会导致指针溢出。

另外值得一提的是,你的内存足够大到不能改变的功能吗?你应该这样分配内存:

char *ptr = new char[1000];
//etc....
if(ptr) delete ptr;

创建(和删除)一个更大的、未初始化的内存缓冲区?

【讨论】:

    猜你喜欢
    • 2021-09-07
    • 2015-05-09
    • 2016-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多