相关疑难解决方法(0)

"&a + 1>&a"会导致未定义的行为

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)

这总是有效吗?

c c++ c99 c++03

17
推荐指数
1
解决办法
333
查看次数

减少指针超出范围; 将它增加到边界

以下是否会在第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 pointers undefined-behavior

15
推荐指数
3
解决办法
1213
查看次数

指针比较"<"与一个超过数组对象的最后一个元素

我知道<只有当指针指向相同的内存空间(如数组)时才允许在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)

c c++ comparison pointers

8
推荐指数
1
解决办法
1051
查看次数

用strrev - C反转一个字符串

我正在尝试使用函数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)

c string itoa

1
推荐指数
1
解决办法
6万
查看次数

如果不使用它,是否可以指向无效位置?

这是一个简单的程序来解释我的意思.给定长度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 >= 0current指向第一个元素之前的一个位置时可能会给出错误的结果,因此具有未定义的值!

c ansi

1
推荐指数
1
解决办法
142
查看次数

C99 中指向数组开始之前的元素

我有一个整数数组:

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数组是由我的函数返回的,因此我无法在数组开头分配虚拟元素。

当您不取消引用该指针时,指向数组之前的一个元素是否有效(例如,当数组位于内存页边界上时)?或者是否有其他解决方案不那么棘手并且具有良好的性能?

c arrays pointers c99

0
推荐指数
1
解决办法
267
查看次数

标签 统计

c ×6

pointers ×3

c++ ×2

c99 ×2

ansi ×1

arrays ×1

c++03 ×1

comparison ×1

itoa ×1

string ×1

undefined-behavior ×1