并c99/c++03保证&a+1 > &a永远是真的吗?
例如,有一个(类似c)std::copy,和
int a = 0 ;
int b[9] ;
std__copy(&a , &a+1 , b) ;
Run Code Online (Sandbox Code Playgroud)
这总是有效吗?
以下是否会在第4行和/或第5行中引发未定义的行为:
#include <stdio.h>
int main(void)
{
char s[] = "foo";
char * p = s - 1; /* line 4 */
printf("%s\n", p + 1); /* line 5 */
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我知道<只有当指针指向相同的内存空间(如数组)时才允许在C标准中使用指针比较.
如果我们采取一个数组:
int array[10];
int *ptr = &array[0];
Run Code Online (Sandbox Code Playgroud)
在比较 ptr,以array+10允许吗?array+10指针是否在数组内存之外被考虑,因此不允许进行比较?
例
for(ptr=&array[0]; ptr<(array+10); ptr++) {...}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用函数strrev()来反转字符串.我知道strrev返回一个指向反转字符串的指针,因此我只是初始化一个已经分配的字符串,其大小与原始字符串相同,并返回strrev函数.显然,这不是正确的方法,我在该行中得到"不兼容的类型"错误.
这是代码:
int ispalindrome(int n)
{
char s[10], sr[10];
itoa(n, s, 10);
printf("%s", s);
sr = strrev(s);
printf("\nReverse: %s", sr);
if(strcmp(s, sr) == 0)
return 1;
else
return 0;
}
Run Code Online (Sandbox Code Playgroud) 这是一个简单的程序来解释我的意思.给定长度n,它初始化由标准输入读取的n个整数序列.
int n, *seq, *current;
scanf("%d", &n);
seq = malloc(n*sizeof(int));
for (current = seq; current - seq < n; current++)
scanf("%d", current);
Run Code Online (Sandbox Code Playgroud)
我怀疑最后一个增量current是否指向分配内存之外的东西.显然从该位置读取是错误的.但是,如果我不读那个位置怎么办?
该程序运行正常,但我的问题是:这是一个标准和良好的做法,还是可能导致麻烦的事情,应该避免?
更新:那么将其附加到上一个程序的末尾呢?
for (current--; current - seq >= 0; current--)
printf("%d\n", *current);
Run Code Online (Sandbox Code Playgroud)
根据@MOHAMED的回答,这是错误的,不是因为它是对无效位置的访问,而是因为current - seq >= 0当current指向第一个元素之前的一个位置时可能会给出错误的结果,因此具有未定义的值!
我有一个整数数组:
int* counters = (int *) calloc(N, sizeof(int));
Run Code Online (Sandbox Code Playgroud)
必须使用基于一个的索引进行索引,例如第一个元素的索引为 1,第二个元素的索引为 2,等等。由于性能非常重要,我决定使用一个技巧:
int* oneIndexedCounters = counters - 1;
Run Code Online (Sandbox Code Playgroud)
这允许我使用基于 1 的索引,而无需从索引中减去 1:
// A[i] - contains one based indexes
for (int i = 0; i < K; i++) {
oneIndexedCounters[A[i]] += B[i]; // many times in code
// some other operations on oneIndexedCounters
}
Run Code Online (Sandbox Code Playgroud)
插入:
for (int i = 0; i < K; i++) {
counters[A[i]-1] += B[i];
// ...
}
Run Code Online (Sandbox Code Playgroud)
counters数组是由我的函数返回的,因此我无法在数组开头分配虚拟元素。
当您不取消引用该指针时,指向数组之前的一个元素是否有效(例如,当数组位于内存页边界上时)?或者是否有其他解决方案不那么棘手并且具有良好的性能?