为字符数组分配内存量并从最后填充它是否合法?

问题描述

我最近做了一个实验,之后我想知道我是否在未定义行为的边缘保持平衡,因为 gcc 没有尖叫 - 但没有标志,gcc 可以吞下很多恐惧。

我有两个数组,想以相反的顺序写入其中一个

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX_SEQ 256

char* regular_sequence = malloc(MAX_SEQ);
scanf("%s",regular_sequence);

//Here is the magic
char reversed_sequence[strlen(regular_sequence)];

void reverse_sequence(char* pattern,char* result) {
     int index = strlen(pattern) - 1;
     for (int i = 0; i < strlen(pattern); i++) {
          result[index--] = pattern[i];
     }
}

reverse_sequence(regular_sequence,reversed_sequence);
printf("%s\n%s\n",regular_sequence,reversed_sequence);

这是合法的还是未定义的行为?我应该先复制序列并覆盖副本吗?

PS - 抱歉可能有错别字,这不是复制的代码

解决方法

一旦正确分配了内存,您就可以以任何您想要的方式访问它——从开始、从中间或以锯齿形模式——至少,就编译器而言。

请注意,由于各种 CPU 缓存技术,顺序访问(从任一端)通常会更快,因此除非需要,否则不应采用锯齿形访问模式。

话虽如此,您的代码有问题:

malloc(sizeof(MAX_SEQ));

不会做你认为它会做的事情,而是会在你的平台上返回整数的大小(即 x86_64 上的 32)。您想删除 sizeof 并使用

malloc(MAX_SEQ);

附言您的代码显然不符合 [mcve] 标准,因此我是在回答一般问题,而不是仔细检查提供的代码段。