我认为这char* = "string"是相同的char* = new char[6].我相信这些字符串是在堆而不是堆栈上创建的.因此,当我使用它们或者它们被自己摧毁时,我是需要销毁它们还是释放它们的记忆?
可能重复:
C字符串文字:它们去哪里了?
我所知道的,
通常,指针必须由malloc()分配,并将分配给堆,然后由free()取消分配;
和
非指针(int,char,float等)将自动分配给堆栈,并且只要函数返回就不会分配
但是,从以下代码:
#include <stdio.h>
int main()
{
char *a;
a = "tesaja";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
将a分配到哪里?堆栈还是堆?
我很困惑为什么以下不起作用:
char * f = "abcdef";
strcpy(f, "abcdef");
printf("%s",f);
char s[] = "ddd";
strcpy(&s[0], "eee");
printf("%s", s);
Run Code Online (Sandbox Code Playgroud)
在这两个例子中,strcpy收到了一个char*但是在第一个例子中它死了一个可怕的死亡.
在这个声明中:
char *a = "string1"
Run Code Online (Sandbox Code Playgroud)
究竟什么是字符串文字?是string1吗?因为这个线程C和C++中字符串文字的类型是什么?说些不同的东西.
据我所知
int main()
{
char *a = "string1"; //is a string- literals allocated memory in read-only section.
char b[] = "string2"; //is a array char where memory will be allocated in stack.
a[0] = 'X'; //Not allowed. It is an undefined Behaviour. For me, it Seg Faults.
b[0] = 'Y'; //Valid.
return 0;
}
Run Code Online (Sandbox Code Playgroud)
请添加除上述要点之外的一些细节.谢谢.
调试输出显示错误 a[0] = 'Y';
Reading symbols from /home/jay/Desktop/MI/chararr/a.out...done.
(gdb) b main
Breakpoint 1 at 0x40056c: …Run Code Online (Sandbox Code Playgroud) 请考虑以下代码:
char* pointerTesting(void) {
char* test = "hello";
return test;
}
int main() {
char* string = pointerTesting();
printf("string: %s\n", string);
}
Run Code Online (Sandbox Code Playgroud)
编译和运行没有问题.但是,根据我的理解,这应该不起作用,因为分配给test指针的内存在堆栈上,并且在返回main时它被销毁.
所以问题是,如果在pointerTesting()函数中没有malloc,它如何工作?
关于Rust编程语言的 切片的第4.3节有这一段:
字符串文字是切片
回想一下,我们谈到了存储在二进制文件中的字符串文字.现在我们了解了切片,我们可以正确理解字符串文字:
Run Code Online (Sandbox Code Playgroud)let s = "Hello, world!";
s这里的类型是&str:它是指向二进制特定点的切片.这也是字符串文字不可变的原因;&str是一个不可变的引用.
现在,正如他们之前所述,一个字符串切片包含一个指针和一个长度的一对(某种形式).对我来说,这段(特别是"我们谈到存储在二进制文件中的字符串文字"和"指向二进制文件的特定点")似乎暗示该指针直接进入程序存储器.不是堆栈,不是堆,而是处理器存储程序所包含的所有指令的实际位置.如果你愿意,可以使用特定的装配线.
这是真的?如果没有,那么他们还能说什么呢?它是如何实际完成的?如果我后来有一个类似的问题,我怎么能自己解决这个问题呢?
可能重复:
如何在C中编译字符串文字?
我在下面写了一些小代码.在这段代码中,我认为将比较第一个和第二个"hello"字符串的地址.我很困惑.首先,我认为两个字符串都将存储在只读存储器中,因此会有不同的地址.但执行后打印出"相等".
当我看到objdump时,我无法看到字符串你好.我知道我没有采用变量来存储它们,但是"hello"存储在哪里.
它会存储在STACK上吗?还是会存储在代码段?
#include<stdio.h>
int main()
{
if ("hello" == "hello")
printf("\n equal ");
else
printf("\n not equal");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我改变if条件时 if ("hello" == "hell1"),"不等于"被打印出来.同样,字符串的存储位置和方式如何.它会存储在STACK上吗?还是会存储在代码段?
如果有人在这里给我精心解答,我真的很感激.谢谢
我正在编写用户API,以这种方式返回const char*值是否正确?
const char * returnErrorString(int errorCode)
{
switch(errorCode)
...
return "This error code means that...";
}
Run Code Online (Sandbox Code Playgroud)
我不喜欢以这种方式返回字符串文字但是在由于RVO优化而被用户读取之前不应该销毁它们,这是正确的吗?有什么建议吗?
目前我用C语言编写了一些嵌入式设备,用英文编写.所以有代码如:
SomeMethod("Please select menu");
OtherMethod("Choice 1");
Run Code Online (Sandbox Code Playgroud)
现在,说我想支持其他语言.但是因为我不知道我对这个设备有多少内存(可能很少可能更多)我不想在其他内存区域中存储字符串的新方法,在那里我可能有更少的空间并使程序崩溃.所以我希望新方法将字符串存储在相同的内存区域并占用相同的空间.所以我想到了这个:
SomeMethod(SELECT_MENU);
OtherMethod(CHOICE_1);
Run Code Online (Sandbox Code Playgroud)
还有一个单独的头文件:
Engligh.h
#define SELECT_MENU "Please select menu"
#define CHOICE_1 "Choice 1"
Run Code Online (Sandbox Code Playgroud)
对于其他语言:
French.h
#define SELECT_MENU "Text in french"
#define CHOICE_1 "same here"
Run Code Online (Sandbox Code Playgroud)
现在根据我想要的语言,我只会包含该头文件.
这是否满足要求,如果我选择英文版本,我的国际化程序strings将存储在同一个内存区域并占用与前一个相同的内存?(我知道法语可能需要更多 - 但这是与法语字母占用更多字节相关的其他问题).
我想因为我会使用defines字符串将它们放在他们以前的内存中.
C中的字符指针令我困惑.
假设我们有一个char指针,它指向string 常量的第一个字符.
char *a="ABCD";
Run Code Online (Sandbox Code Playgroud)
然后我们不能使用指针a更改该字符的值,因为以下语句会导致分段错误.
*a='X';
Run Code Online (Sandbox Code Playgroud)
现在假设我们有一个char指针,指向一个字符常量.
const char B='X';
char *ptr=&B;
Run Code Online (Sandbox Code Playgroud)
然后我们可以使用该语句更改该字符的值
*ptr='Z';
Run Code Online (Sandbox Code Playgroud)
我的问题是,这是一个未定义的行为,证明C不健壮?或者是否涉及更深层次的逻辑?