c - 可以通过将指针更改为更高的索引来缩小 C 中的数组吗?

标签 c arrays pointers char shrink

例如,如果我有:

char arr[] = "this is a test";

但我决定将其缩小 5,所以我这样做了:

arr = &arr[5]:

我尝试了一下,它似乎工作正常,我只是想知道这是否会导致任何未定义的行为或“内存问题”。

最佳答案

不,这段代码甚至无法编译。它给出了这个错误消息:

error: assignment to expression with array type
     arr = &arr[5];
         ^

你可以做的是:

char arr[] = "this is a test";
char *ptr = arr;
printf("Before: %s\n", ptr);
ptr = &arr[5];
printf("After: %s\n", ptr);

这是否是一个好主意取决于具体情况。由于数组是在堆栈上分配的,因此非常安全。不会导致内存泄漏。

这是一个关于这个主题的有趣的扭曲。写这个怎么样?

char * arr = "this is a test";

那么你有一个指针而没有数组,对吗?嗯,这段代码确实允许您执行重新分配arr = &arr[5]。但是,这并不等同于:

char str[] = "this is a test";
char * arr = malloc(strlen(str));
strcpy(arr, str);

它相当于:

static char _unnamed_[] = "this is a test";
char * arr = _unnamed_;

这两者之间的一个区别是您是否从函数返回arr。另一种情况是您是否对其调用free

数组与指针

在您帖子的评论中,您“认为数组名称本质上与指针相同”,这是错误的。很容易犯这个错误,我已经犯过数千次了,在这件事上我已经在SO这里得到了公平的份额。但数组不是指针。然而,在许多情况下,数组会衰减为指针,这正是上面char *ptr = arr行所发生的情况。

有很多问题对此都有启发性的答案。这是两个:

What is the difference between char array vs char pointer in C?

Why do I get a segmentation fault when writing to a string initialized with "char *s" but not "char s[]"?

实际上,ptr = &arr[5] 行上也发生了数组衰减为指针的情况。根据[]运算符的定义,这与编写ptr = &(*(arr + 5))

相同

Why is a[5] the same as 5[a]?

关于c - 可以通过将指针更改为更高的索引来缩小 C 中的数组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51260175/

相关文章:

c - 我是否需要显式包含共享库中使用的通用头文件(在包含路径文件夹中)?

objective-c - 在 C 中的结构中扩展数组

php - 需要一个关联数组,但具有与 NuSoap 相同的键

java - 如何迭代包含对象的 LinkedList - Java

c - 结构中的结构数组 (C)

c - 将指针传递给结构数组时出错

javascript - 什么时候用对象,什么时候用数组

c++ - 通过指针 vector 删除指针

c++ - 为返回的引用分配空间

c - 求 3X3 矩阵 C 的次矩阵