当前位置: 首页 > 知识库问答 >
问题:

C[重复]中连接变量和常量之间的区别

冀冯浩
2023-03-14

我试图弄清楚为什么C会这样做。这是一个非常简单的字符串连接代码,但是根据strcat中的内容,我得到了非常不同的输出。

有人能解释一下吗?

// With all declared variables
char * hello = "HELLO";

char * world = "WORLD";

char * space = " ";

char * say_hello(){
  char * out = "";
  strcat(out,hello);
  strcat(out,space);
  strcat(out,world);
  return out;
}

main(){
   puts(say_hello()); 
}

// outputs "HELLO WORLD"
// With all hello as declared variable

char * hello = "HELLO";

char * say_hello(){
  char * out = "";
  strcat(out,hello);
  strcat(out," ");
  strcat(out,"WORLD");
  return out;
}

main(){
   puts(say_hello()); 
}

// outputs "HELLOELLOLOELLO"
// With all hello and world as declared variable

char * hello = "HELLO";

char * world = "WORLD";

char * say_hello(){
  char * out = "";
  strcat(out,hello);
  strcat(out," ");
  strcat(out,world);
  return out;
}

main(){
   puts(say_hello()); 
}

// outputs "HELLOELLOWORLD"
// With all constants

char * say_hello(){
  char * out = "";
  strcat(out,"HELLO");
  strcat(out," ");
  strcat(out,"WORLD");
  return out;
}

main(){
   puts(say_hello()); 
}

// outputs "HELLO WORLD"

共有1个答案

庞瀚
2023-03-14

所有的代码都是无效和危险的。

首先,修改字符串文字是允许的,尝试这样做会调用未定义的行为strcat将修改作为第一个参数传递的字符串,因此不能在那里传递字符串文字(或指向字符串文字的指针)。

其次,"是一个元素数组{'\0'}。它不能存储通过连接创建的字符串。您必须分配足够的空间。

请注意,非静态局部数组的生命周期在从函数返回时结束,因此必须动态或静态地分配它们。

动态分配:

#include <stdlib.h>

char * say_hello(){
  char * out = calloc(32, sizeof(*out)); /* allocate */
  if (out == NULL) exit(1); /* check if allocation succeeded */
  strcat(out,hello);
  strcat(out,space);
  strcat(out,world);
  return out;
}

静态分配(警告:这不是线程安全的):

char * say_hello(){
  static char out[32];
  out[0] = '\0';
  strcat(out,hello);
  strcat(out,space);
  strcat(out,world);
  return out;
}
 类似资料:
  • 问题内容: 请帮助我理解常量变量和Java变量之间的区别。我对此有些困惑。 问题答案: 常量 是概念,是变量的属性。 是用于声明常量变量的java关键字。 正如其他人所指出的那样,从语义/语言的观点来看, 常量变量 的表达是矛盾的,因此,我们可以争论其正确性。 引用规范,无论如何,我们可以阅读 原始类型的最终变量,并使用编译时常数表达式(第15.28节)进行了初始化,称为 常量变量 。 因此,我想

  • 问题内容: 我已经在Python的Stack Exchange上阅读了很多答案,为什么在类中使用“ self”? 阅读这些答案后,我了解到实例变量对于该类的每个实例都是唯一的,而在所有实例之间共享类变量。 在玩耍时,我发现这段代码给出了输出: 但是,此代码作为输出,在我看来应为: 为什么我运行时类变量没有更新?我没有编程方面的经验,所以请原谅。 问题答案: 类变量 被 实例属性 遮盖 。这意味着在

  • 我遵循了www.patrickvideos.com的java SE教程,在关于“类”的章节中遇到了一个问题 他明确地说,。然而,如果我没有弄错的话,变量本身不能是对象,而只能包含对对象或类实例的引用。那么,

  • 问题内容: 我是Java编程的新手。谁能说出Java中的全局变量和局部变量之间的区别? 问题答案: 您的问题有点困惑,因为您在标题中引用的是static / global,而在问题中引用的是global / local。 变量绑定到一个 类 , 每个类 将有 一个实例 。 类可以具有成员变量,并且该类的 每个实例 将有 一个实例 。 请注意,如果您有多个类加载器,这将变得更加复杂。在这种情况下,您

  • 问题内容: 在Linux内核中,信号量用于为数据的关键部分提供互斥,而Completion变量用于在等待事件的2个线程之间进行同步。为什么不使用信号量进行这种同步呢?使用完成变量比使用信号量有什么优势吗? 问题答案: 您可能要使用补全而不是信号量有两个原因。首先,多个线程可以等待完成,并且可以通过调用来全部释放它们。使信号量唤醒未知数量的线程更为复杂。 其次,如果等待线程要取消分配同步对象,则在使

  • 变量、对象和引用之间到底有什么区别? 例如:它们都指向某种类型,并且它们都必须保存值(当然,除非您有临时的可null类型),但是它们的功能和实现之间有何不同? 例子: 它们有相同的概念,但又有什么不同呢?