问题描述
我最近做了一个实验,之后我想知道我是否在未定义行为的边缘保持平衡,因为 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] 标准,因此我是在回答一般问题,而不是仔细检查提供的代码段。