首页 > 解决方案 > 如何将函数字符串参数存储在堆栈上

问题描述

void test(char arr[]){
        ;
    }
    
int main()
    {
        test("abc");

        return 0;
    }

abc是一个字符串常量,因此将其传递给函数将在堆上创建arr一个指针,"abc"但我希望它在堆栈上(我想对其进行字符串连接)

  1. 如何存储arr在堆栈上
  2. 也设置char arr[3]arr[ (any size) ]有效果?因为我的编译器允许这样做,而我没有注意到。

标签: arrayscmemorystackheap-memory

解决方案


所有char arr[], char arr[3],char arr[(any size)]在函数参数中具有相同的含义。他们的意思是char* arr

根据调用约定,参数(指针)arr通常会放在堆栈上(通常在 x86 上)或寄存器上(通常在 x86-64 上)。

您真正想要做的是将字符串放在堆栈上。

可以通过让调用者将要传递的内容放入堆栈来完成:

void test(char arr[]){
    ;//////////////////////////////////////////
}

int main()
{
    char data[102400] = "abc"; /* allocate enough space for what will be concatenated */

    test(data);

    return 0;
}

或者让函数复制字符串。

#include <string.h>

void test(char arr[]){
    char data[102400];
    strcpy(data, arr);
    ;//////////////////////////////////////////
}

int main()
{
    test("abc");

    return 0;
}

推荐阅读