我最近做了一个实验,在那之后,我想知道我是否在未定义行为的边缘保持平衡,因为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("%sn%sn", regular_sequence, reversed_sequence);
这是合法的还是不明确的行为?我应该先复制序列并覆盖副本吗?
PS-很抱歉可能有错别字,这不是一个复制的代码。
一旦正确分配了内存,您就可以以任何方式访问它——从开始、从中间或以Z字形模式访问——至少就编译器而言是这样。
注意,由于各种CPU缓存技术,顺序访问(从两端(通常更快,所以除非需要,否则不应该使用Z字形访问模式
话虽如此,你的代码中有一个问题:
malloc(sizeof(MAX_SEQ));
它不会按照你认为的那样做,而是会在你的平台上返回整数的大小(即x86_64上的32(。你想放弃sizeof
,只使用
malloc(MAX_SEQ);
第页。S.您的代码显然不符合[mcve],所以我是在回答所问的一般问题,而不是仔细检查提供的代码片段。