【问题标题】:how to store function string argument on the stack如何将函数字符串参数存储在堆栈上
【发布时间】:2021-03-10 11:08:53
【问题描述】:
void test(char arr[]){
        ;
    }
    
int main()
    {
        test("abc");

        return 0;
    }

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

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

【问题讨论】:

  • 定义一个本地数组char s[] = "abc";并传递给test。但是听起来你可能想让它更大以进行连接:char s[100] = "abc";
  • 我可以这样做,但我这样做是为了挑战,挑战的测试直接像 test("abc") 一样。
  • 然后你需要在函数中做它并在那里复制输入。作为以下答案中的第二种方法
  • 你想解决什么问题?
  • @kltt accum("RqaEzty") -> "R-Qq-Aaa-Eeee-Zzzzz-Tttttt-Yyyyyyy"

标签: arrays c memory stack heap-memory


【解决方案1】:

所有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;
}

【讨论】:

  • 谢谢,第二个问题呢?
  • @random 不会有效果。
  • 那如果它没用为什么还允许
  • @random 如果您想要一种不允许任何无用的语言,那么 C 绝对是错误的语言。 ;)
猜你喜欢
  • 2016-01-12
  • 1970-01-01
  • 1970-01-01
  • 2012-04-17
  • 2014-04-01
  • 1970-01-01
  • 2017-11-16
  • 2021-01-25
  • 2014-04-21
相关资源
最近更新 更多