在C中,可以在声明中使用字符串文字,如下所示:
char s[] = "hello";
Run Code Online (Sandbox Code Playgroud)
或者像这样:
char *s = "hello";
Run Code Online (Sandbox Code Playgroud)
那么区别是什么呢?我想知道在编译和运行时的存储持续时间实际发生了什么.
考虑:
char amessage[] = "now is the time";
char *pmessage = "now is the time";
Run Code Online (Sandbox Code Playgroud)
我从C编程语言第2版中读到,上述两个陈述没有做同样的事情.
我一直认为数组是一种操作指针来存储一些数据的便捷方式,但显然情况并非如此...... C中数组和指针之间的"非平凡"差异是什么?
我已经看过多次使用术语"IB"和"UB",特别是在C++的上下文中.我试过用谷歌搜索它们,但显然这些两个字母的组合看起来很有用.:P
所以,我问你......当他们被说成是一件坏事时,他们的意思是什么?
C中字符串文字的类型是什么?是char *或const char *否const char * const?
那么C++呢?
过去几个小时我遇到了一个问题,虽然我明白了.这是我的麻烦:
void cut_str(char* entry, int offset) {
strcpy(entry, entry + offset);
}
char works[128] = "example1\0";
char* doesnt = "example2\0";
printf("output:\n");
cut_str(works, 2);
printf("%s\n", works);
cut_str(doesnt, 2);
printf("%s\n", doesnt);
// output:
// ample1
// Segmentation: fault
Run Code Online (Sandbox Code Playgroud)
我觉得char*/char []有一些重要的东西,我没有来到这里.
#include<string.h>
#include<stdio.h>
void main()
{
char *str1="hello";
char *str2="world";
strcat(str2,str1);
printf("%s",str2);
}
Run Code Online (Sandbox Code Playgroud)
如果我运行这个程序,我得到运行时程序终止.
请帮我.
如果我用这个:
char str1[]="hello";
char str2[]="world";
Run Code Online (Sandbox Code Playgroud)
然后它正在工作!
但为什么
char *str1="hello";
char *str2="world";
Run Code Online (Sandbox Code Playgroud)
这段代码不起作用????
使用指针表示法比数组表示法有什么优势吗?我意识到在某些特殊情况下指针表示法可能更好,但在我看来数组表示法更清晰。我的教授告诉我们,他更喜欢指针表示法“因为它是 C”,但这不是他会标记的东西。我知道将字符串声明为字符数组与将指针声明为字符串之间存在差异 - 我只是在谈论一般循环数组。
我正在哈佛大学攻读 MOOC课程CS50.我的最后一个讲座是关于内存分配和指针(两个对我来说绝对新的概念).
所教的是malloc(10*sizeof(char))在堆上分配足够的字节来存储10个字符并返回指向第一个字节的指针,该指针可以保存在另一个变量中,如下所示char *x = malloc(10*sizeof(char)).为了释放内存,人们会使用free(x).
但还有另一种方法可以让计算机保留足够的内存来存储10个字符,即char c[10].
c也是一个类型的指针char*?char c[10]还保留内存堆中的malloc呢?char c[3] = "aaa";free(c);返回运行时错误; 所以我似乎无法释放我分配的内存char c[3].这是为什么?我真的很感激为那些刚学过指针的人量身定做的答案.
char s[] = "abc";
char t[3] = "abc";
Run Code Online (Sandbox Code Playgroud)
实际上与:
char s[] = { 'a', 'b', 'c', '\0' };
char t[] = { 'a', 'b', 'c' };
Run Code Online (Sandbox Code Playgroud)
以下内容:
char *word = "abc";
word[0] = 'd';
Run Code Online (Sandbox Code Playgroud)
地方word在只读存储器,导致非法内存操作word[0] = 'd'错误.
这只是chars 的情况吗?当我做这样的事情时,我不会得到错误:
int array[] = {1, 2, 3};
int *p = array;
p[0] = 0; // No error here
array[1] = 1; // or here
Run Code Online (Sandbox Code Playgroud) 我正在使用Keil C51编译器来编程8051微控制器.由于某些原因,我的代码没有运行 - 我设法追踪错误,但我仍然难以理解它.为什么第一个代码与另一个代码相比是错误的?值得注意的是,编译器没有抛出任何错误,代码甚至没有在微控制器上启动.
错误的代码:
file1.h
extern STRUCT_TYPEDEF array_var[];
Run Code Online (Sandbox Code Playgroud)
file2.c中
// Global variable initialization
STRUCT_TYPEDEF array_var[] = some_struct.array2_var;
Run Code Online (Sandbox Code Playgroud)
将这些更改为:
file1.h
extern STRUCT_TYPEDEF *array_var;
Run Code Online (Sandbox Code Playgroud)
file2.c中
// Global variable initialization
STRUCT_TYPEDEF *array_var = &some_struct.array2_var[0];
Run Code Online (Sandbox Code Playgroud)
它开始工作了.
此外,这部分代码仅在类似"array_var [0] .property = ..."的函数中引用,但这些函数都没有从应用程序中调用过.
some_struct变量在另一个模块中声明.
它为什么会这样?[]和*之间有什么区别我不知道吗?
EDIT1: 据说指针和数组是不同的东西......但是,"[]"语法与"*"的区别是什么?我认为只要方括号为空(例如函数参数),编译器就会将其转换为指针.我还认为提供一个数组会导致给我第一个元素的地址.
现在,每个人都在说指针和数组是不同的 - 但我找不到任何关于它们究竟有什么不同的信息.当我将数组作为rvalue而不是指向其第一个元素的指针时,编译器如何看待它?