【问题标题】:C: Passing Strings by reference?C:通过引用传递字符串?
【发布时间】:2016-07-05 12:12:00
【问题描述】:

为了理解 setjmp 和 longjmp 函数,我编写了以下代码,但我认为问题与这些函数无关。我期望输出是:

function1
function2
function2

但我不断得到:

function1
function2
function1

作为输出。代码:

#include <stdio.h>
#include <setjmp.h>
#include <stdlib.h>

void f1(char * a);
void f2(char * a);

jmp_buf buf1;

int main(int argc, char *argv[])
{
   char * w;
   f1( w);
   return 0;
}

void f1(char * a)
{
   a = "funtion 1";
   printf("%s\n",a);

   int i = setjmp( buf1 );
   if( i == 0 )
      f2( a );

   printf("%s\n", a);

}

void f2(char * a)
{
   a = "function 2";
   printf("%s\n",a);
   longjmp( buf1 , 2 );
}

我在这里做错了什么?感谢您的帮助。

【问题讨论】:

  • 你做错的是覆盖char *a
  • int i = setjmp( buf1 ); 您不能在赋值中使用来自 setjmp() 的“返回值”(在这种情况下,初始化程序是一个赋值),只能在 if 或 switch 条件下测试它(甚至while/do/for)

标签: c parameter-passing pass-by-reference setjmp


【解决方案1】:

中没有按引用传递,它只是按值传递。但是,您可以将指针传递给main() 中的指针,像这样

int main(int argc, char *argv[])
{
   char *w;
   f1(&w);
   return 0;
}

void f1(char **a)
{
   *a = "funtion 1";
   printf("%s\n", *a);

   int i = setjmp( buf1 );
   if (i == 0)
      f2(a);
   printf("%s\n", *a);

}

void f2(char **a)
{
   *a = "function 2";
   printf("%s\n", *a);
   longjmp(buf1 , 2);
}

注意:对此要非常小心,您正在分配一个字符串文字,您不应尝试修改它。

【讨论】:

  • 我必须删除 'f2(&a)' 中的 '&' 才能正常工作。这可能是什么原因?
  • 是的,应该是这样的。对不起,是我的错
猜你喜欢
  • 2014-08-11
  • 2017-07-25
  • 2018-09-01
  • 2010-12-24
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 2016-04-09
  • 2015-04-08
相关资源
最近更新 更多