c - 为字符数组分配内存量并从最后填充它是否合法?
问题描述
我最近做了一个实验,之后我想知道我是否在未定义行为的边缘保持平衡,因为 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 缓存技术,顺序访问(从任一端)通常更快,因此除非需要,否则不应使用 zigzag 访问模式。
话虽如此,您的代码中存在问题:
malloc(sizeof(MAX_SEQ));
不做你认为它做的事,而是将返回你平台上的整数大小(即 x86_64 上的 32)。你想放弃sizeof
并使用
malloc(MAX_SEQ);
PS您的代码显然不符合 [mcve] 标准,所以我回答的是一般性问题,而不是仔细检查提供的代码段。
推荐阅读
- ruby-on-rails - 在 MAC(Big Sur)的终端中键入命令“rails server”时出现加载错误
- regex - 正则表达式前瞻和“字符串结束”不起作用
- twilio - Twilio 函数中的 if /else 语句始终返回 false
- flutter - 当我将 id 作为 DropdownMenuItem | 中的值访问时,可搜索的下拉搜索不起作用 扑
- powerbi - Power BI 服务中的数据源凭据和计划刷新灰显
- c# - '可查询
' 不包含 'FindAsync' 的定义 - python - statsmodels glm fit_constrained '无法识别的令牌'
- laravel - 为什么 laravel 8 中的 foreach 不起作用,它没有循环
- postgresql - 根据表大小(显然)使用索引进行查询
- json - 添加了请求描述 | AssertionError: 预期 [] 的长度大于 0 但得到 0?