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

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)

我尝试了这个似乎工作正常,我只是想知道这是否会导致任何未定义的行为或"内存问题".

klu*_*utt 5

不,这段代码甚至不会编译.它给出了以下错误消息:

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上面一行中发生的情况.

关于这一点,有许多问题有启发性的答案.这是两个:

C中的char数组与char指针有什么区别?

为什么在写入用"char*s"而不是"char s []"初始化的字符串时会出现分段错误?

实际上,衰减到指针的数组也是在线上发生的事情ptr = &arr[5].根据[]运算符的定义,这与写入相同ptr = &(*(arr + 5))

为什么a[5]一样5[a]