例如,如果我有:
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?
实际上,ptr = &arr[5]
行上也发生了数组衰减为指针的情况。根据[]
运算符的定义,这与编写ptr = &(*(arr + 5))
关于c - 可以通过将指针更改为更高的索引来缩小 C 中的数组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51260175/