首页 > 解决方案 > 为字符数组分配内存量并从最后填充它是否合法?

问题描述

我最近做了一个实验,之后我想知道我是否在未定义行为的边缘保持平衡,因为 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 - 抱歉可能有错别字,这不是复制代码。

标签: cstringmemory-management

解决方案


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

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

话虽如此,您的代码中存在问题:

malloc(sizeof(MAX_SEQ));

不做你认为它做的事,而是将返回你平台上的整数大小(即 x86_64 上的 32)。你想放弃sizeof并使用

malloc(MAX_SEQ);

PS您的代码显然不符合 [mcve] 标准,所以我回答的是一般性问题,而不是仔细检查提供的代码段。


推荐阅读