Jam*_*ing 2 c arrays pointers char shrink
例如,如果我有:
char arr[] = "this is a test";
Run Code Online (Sandbox Code Playgroud)
但我决定将它缩小5,所以我这样做:
arr = &arr[5]:
Run Code Online (Sandbox Code Playgroud)
我尝试了这个似乎工作正常,我只是想知道这是否会导致任何未定义的行为或"内存问题".
不,这段代码甚至不会编译.它给出了以下错误消息:
error: assignment to expression with array type
arr = &arr[5];
^
Run Code Online (Sandbox Code Playgroud)
你能做的是:
char arr[] = "this is a test";
char *ptr = arr;
printf("Before: %s\n", ptr);
ptr = &arr[5];
printf("After: %s\n", ptr);
Run Code Online (Sandbox Code Playgroud)
如果这是一个好主意,取决于具体情况.由于数组是在堆栈上分配的,因此非常安全.它不会导致内存泄漏.
这是一个关于这个主题的有趣的扭转者.写这个怎么样?
char * arr = "this is a test";
Run Code Online (Sandbox Code Playgroud)
然后你有一个指针,没有数组,对吗?好吧,这段代码确实允许你执行重新分配arr = &arr[5].但是,这不等于:
char str[] = "this is a test";
char * arr = malloc(strlen(str));
strcpy(arr, str);
Run Code Online (Sandbox Code Playgroud)
它相当于:
static char _unnamed_[] = "this is a test";
char * arr = _unnamed_;
Run Code Online (Sandbox Code Playgroud)
这两者之间的一个区别是,如果您arr从函数返回.另一个是如果你要求free它.
数组与指针
在您对帖子的评论中,您"认为数组名称与指针基本相同",这是错误的.犯这个错误很容易,而且我已经做了好几千次了,而且在这件事情上,我已经在SO上得到了公平的分享.但是数组不是指针.但是,在许多情况下,数组会衰减为指针,这正是char *ptr = arr上面一行中发生的情况.
关于这一点,有许多问题有启发性的答案.这是两个:
为什么在写入用"char*s"而不是"char s []"初始化的字符串时会出现分段错误?
实际上,衰减到指针的数组也是在线上发生的事情ptr = &arr[5].根据[]运算符的定义,这与写入相同ptr = &(*(arr + 5))
| 归档时间: |
|
| 查看次数: |
86 次 |
| 最近记录: |