考虑:
char amessage[] = "now is the time";
char *pmessage = "now is the time";
Run Code Online (Sandbox Code Playgroud)
我从C编程语言第2版中读到,上述两个陈述没有做同样的事情.
我一直认为数组是一种操作指针来存储一些数据的便捷方式,但显然情况并非如此...... C中数组和指针之间的"非平凡"差异是什么?
可能重复:
内存分配char*和char []
任何人都可以解释我这些代码行之间的区别
char *p = "String";
char p2[] = "String";
char p3[7] = "String";
Run Code Online (Sandbox Code Playgroud)
我应该在什么情况下使用以上各项?
正如标题所说,有什么区别
char a[] = ?string?; and
char *p = ?string?;
Run Code Online (Sandbox Code Playgroud)
这个问题在接受我采访时被问到了.我甚至不理解这个说法.
char a[] = ?string?
Run Code Online (Sandbox Code Playgroud)
什么是?运营商?它是字符串的一部分还是具有某些特定含义?
#include <stdio.h>
#define N 10
char str2[N]={"Hello"};
int main(){
printf("sizeof(str2): %d bytes\n", sizeof(str2));
printf("sizeof(&str2): %d bytes\n", sizeof(&str2));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
sizeof(str2): 10 bytes
sizeof(&str2): 4 bytes
Run Code Online (Sandbox Code Playgroud)
我知道str2单独是数组中第一个元素的地址str2.并且当str2它的参数何时sizeof返回整个数组str2的大小.
另外,&str2也是arr中第一个元素的地址,str2但是来自不同的类型(char (*)[N]==指向数组的指针).但是&str2当它是一个论证时,它是如何表现的sizeof?
假设我有一个以这种方式返回C字符串的简单函数:
const char * getString()
{
const char * ptr = "blah blah";
return ptr;
}
Run Code Online (Sandbox Code Playgroud)
我以这种方式从main()调用getString():
Run Code Online (Sandbox Code Playgroud)const char * s = getString();
1)根据gdb,变量ptr存储在堆栈中,但ptr指向的字符串不是:
(gdb) p &ptr
$1 = (const char **) 0x7fffffffe688
(gdb) p ptr
$2 = 0x4009fc "blah blah"
Run Code Online (Sandbox Code Playgroud)
这是否意味着"blah blah"不是getString()中的局部变量?
我想如果它是一个局部变量,我将无法将它传递给我的main()函数......但如果它不存在,它存储在哪里?在堆上?这是OS每次点击字符串时实现的"一种"动态内存分配,还是什么?
2)如果我使用数组而不是指针,这样:
const char *getString2()
{
const char a[] = "blah blah blah";
return a;
}
Run Code Online (Sandbox Code Playgroud)
编译器警告我:
warning: address of local variable ‘a’ returned
(当然程序编译,但它不起作用).
实际上,如果我问gdb,我会的
(gdb) p &a
$2 = (const char …Run Code Online (Sandbox Code Playgroud) 可能重复:
char*str ="STRING"和char str [] ="STRING"之间的区别?
C:指针和数组之间的差异
嗨,
谁能告诉我下面的陈述之间的区别?
char *p = "This is a test";
char a[] = "This is a test";
Run Code Online (Sandbox Code Playgroud) include<stdio.h>
int main()
{
//char b[10];
char *a="goodone";
//a=b;
scanf("%s",a);//this scanf fails and thow segmentation fault.
printf("%s",a);
}
Run Code Online (Sandbox Code Playgroud)
为什么这不起作用?我用这个scanf试了很多但是,当我为我的变量保留内存a*(通过指定a = b(注释))它工作正常.否则它没有.我相信char*a会为其字符串("goodone")分配一些内存,并将该内存位置返回其值.和printf一起工作正常,为什么scanf没有?请救我这个....
我正在运行这个简单的程序,我得到的输出是"总线错误".使用一些调试语句我发现它发生的点是在strcat()调用.
#include<stdio.h>
#include<string.h>
main()
{
char *s = "this is ";
char *s1 = "me";
strcat(s,s1);
printf("%s",s);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我在MAC,64位操作系统上使用gcc编译器运行它.如果我需要提供更多规格,请告诉我.
谢谢!
可能重复:
char*str ="STRING"和char str [] ="STRING"之间的区别?
需要一些C编程方面的帮助
而这个剪辑会导致分段错误
int main(void) {
char* str ="abcde";
str[strlen(str)-1] ='\0';
printf("%s",str);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果我把char str [] ="abcde";指针放在
完美的指针上,你知道为什么会这样吗?
我写了以下代码:
int main()
{
char *str = "hello";
str[0] = 'H';
printf("%s\n", str);
}
Run Code Online (Sandbox Code Playgroud)
这给了我一个分段错误,我不明白为什么.
str是pointer to char不是const char.即使是这样的情况也不应该像下面的程序那样给出编译错误:
int main()
{
const char *str = "hello";
str[0] = 'H';
printf("%s\n", str);
}
Run Code Online (Sandbox Code Playgroud)
它给出了一个错误:assignment of read-only location *str.
编辑
如果我的代码将指针放在只读位置,我不应该得到编译错误?