相关疑难解决方法(0)

指针数组 - 外部问题

文件1.c.

int a[10];
Run Code Online (Sandbox Code Playgroud)

文件main.c:

extern int *a;

int main()
{
    printf("%d\n", a[0]);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

给我一个段错误!出了什么问题?

c arrays pointers extern segmentation-fault

20
推荐指数
2
解决办法
4981
查看次数

如果数组是通过引用传递的,为什么要使用 int(&)[]?

考虑:

#include <iostream>
using namespace std;

void Change(int arr[3]) {
    for (int i = 0; i < 3; i++) {
        arr[i] = 1;
    }
}

int Test() {
    int arr[3] = { 0, 0, 0 };

    for (int i = 0; i < 3; i++) {
        cout << arr[i] << endl;
    }

    Change(arr);

    for (int i = 0; i < 3; i++) {
        cout << arr[i] << endl;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

由于数组默认作为指向其第一个元素的指针传递并且不会被复制,因此在函数中更改数组元素的值实际上会导致在函数调用者中更改数组该元素的值,这就是为什么以上代码输出

#include <iostream>
using namespace std;

void Change(int …
Run Code Online (Sandbox Code Playgroud)

c++ pass-by-reference pass-by-value function-declaration

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

在C++中向数组添加整数?

考虑:

int sum(const int numbers[], const int size){
    if (size == 0)
        return 0;
    else
        return numbers[0] + sum(numbers+1, size-1);
}
Run Code Online (Sandbox Code Playgroud)

这是一个简单的递归函数,来自MIT 6.096,用于添加任意数量的整数,并且它可以工作.

我无法理解的是在最后一行:

如何numbers+1工作,给定numbers[]是一个int数组,你不应该能够将一个整数添加到int[]常量?

c++ arrays recursion arguments arrayaccess

16
推荐指数
2
解决办法
3602
查看次数

指针数组的指针

我有一个int指针数组,int* arr[MAX];我想将其地址存储在另一个变量中.如何定义指针数组的指针?即:

int* arr[MAX];
int (what here?) val = &arr;
Run Code Online (Sandbox Code Playgroud)

c arrays pointers

14
推荐指数
2
解决办法
5万
查看次数

引用Array与对数组指针的引用

void check(void* elemAddr){
    char* word = *((char**)elemAddr);
    printf("word is %s\n",word);
}

int main(){
    char array[10] = {'j','o','h','n'};
    char * bla = array;
    check(&bla);
    check(&array);
}
Run Code Online (Sandbox Code Playgroud)

输出:

word is john

RUN FINISHED; Segmentation fault; core dumped;
Run Code Online (Sandbox Code Playgroud)

第一个工作,但第二个不工作.我不明白为什么会这样.

c arrays pointers

14
推荐指数
2
解决办法
1523
查看次数

snprintf错误.sizeof的参数与destination相同

gcc 4.8在构建时给我一个错误

#include <string.h>
#include <stdio.h>

static inline void toto(char str[3])
{
    snprintf(str, sizeof(str), "XX"); 
}

int main(){
    char str[3]; 
    toto(str);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是gcc错误

错误:'snprintf'调用中'sizeof'的参数与目标的表达式相同; 你的意思是提供一个明确的长度?

注意:我使用-Wall -Werror标志将警告转换为错误.

这里有类似的东西 在评论中,有人回答了这个问题

"对于固定长度缓冲区,我通常使用strncpy(dest,src,sizeof(dest)); dest [sizeof(dest)-1] ='\ 0';这保证了NULL终止,并且比snprintf更麻烦更不用说了许多人使用snprintf(dest,sizeof(dest),src);相反,当他们的程序任意崩溃时,他们会非常惊讶."

但这是错误的:gcc 4.8说

"错误:'strncpy'调用中'sizeof'的参数与目标的表达式相同;你的意思是提供一个显式长度吗?[-Werror = sizeof-pointer-memaccess]"

在gcc 4.8文档中,他们正在讨论这个问题:他们说:

-Wall的行为已更改,现在包含新的警告标志-Wsizeof-pointer-memaccess.这可能会导致代码中的新警告与以前版本的GCC一起干净地编译.

例如,

include string.h

struct A { };

int main(void) 
{
    A obj;
    A* p1 = &obj;
    A p2[10];

    memset(p1, 0, sizeof(p1)); // error
    memset(p1, 0, sizeof(*p1)); // ok, dereferenced
    memset(p2, 0, sizeof(p2)); // ok, array …
Run Code Online (Sandbox Code Playgroud)

c printf gcc

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

将数组显式衰减为指针

将数组显式衰减为指针的最简洁和惯用的方法是什么?


例如,考虑一下您需要能够指导SFINAE或明确说明过载的情况:

template<typename T, std::size_t N> void foo(T(&x)[N]);
template<typename T>                void foo(T *x); 
//
int x[2] = {0, 1};
foo(x);
Run Code Online (Sandbox Code Playgroud)

c++ arrays pointers c++11

10
推荐指数
2
解决办法
631
查看次数

基于范围的for-loop on数组传递给非主函数

当我尝试在gcc 4.8.2中编译以下代码时,我收到以下错误:

test.cc: In function ‘void foo(int*)’:
test.cc:15:16: error: no matching function for call to ‘begin(int*&)’
   for (int i : bar) {
                ^
Run Code Online (Sandbox Code Playgroud)

与模板库中更深层次的其他一些人一起.

#include <iostream>
using namespace std;

void foo(int*);

int main() {
  int bar[3] = {1,2,3};
  for (int i : bar) {
    cout << i << endl;
  }
  foo(bar);
}

void foo(int* bar) {
  for (int i : bar) {
    cout << i << endl;
  }
}
Run Code Online (Sandbox Code Playgroud)

如果我重新定义foo使用索引for循环,那么代码将按预期编译和运行.此外,如果我将基于范围的输出循环移动到main,我也会得到预期的行为.

如何barfoo一种能够在其上执行基于范围的for循环的方式传递数组?

c++ gcc for-loop c++11

9
推荐指数
2
解决办法
2398
查看次数

使用sizeof运算符可以很好地定义此代码吗?

#include <stdio.h>

void test(int arr[]);

int main ()
{
    int *arr[3];
    int ar1[2] = { 1, 2 };
    int ar2[3] = { 3, 4, 5 };
    int vla[ar2[1]];
    arr[0] = ar1;
    arr[1] = ar2;
    arr[2] = vla;

    for  (int i = 0; i < 3; i++)
    {
        test(arr[i]);
    }
}

void test(int arr[])
{
    printf("%zu\r\n", sizeof(arr));
}
Run Code Online (Sandbox Code Playgroud)

正如标题所说:这是有效的吗?如果是这样,有没有办法test()通过使用sizeof像数组一样输入的函数参数来输出不同的值?

c arrays sizeof

9
推荐指数
2
解决办法
520
查看次数

分配给指针时从不兼容的指针类型警告初始化

当我使用这段代码时,GCC给我一个'来自不兼容指针类型的初始化'警告(虽然代码工作正常并且做了它应该做的事情,它打印了数组的所有元素).

#include <stdio.h>

int main(void)
{
    int arr[5] = {3, 0, 3, 4, 1};
    int *p = &arr;

    printf("%p\n%p\n\n", p);

    for (int a = 0; a < 5; a++)
        printf("%d ", *(p++));
    printf("\n");
}
Run Code Online (Sandbox Code Playgroud)

但是当我使用这段代码时没有给出警告

int main(void)
{
    int arr[5] = {3, 0, 3, 4, 1};
    int *q = arr;

    printf("%p\n%p\n\n", q);

    for (int a = 0; a < 5; a++)
        printf("%d ", *(q++));
    printf("\n");
}
Run Code Online (Sandbox Code Playgroud)

这两个片段之间的唯一区别是我指定*p =&arr和*q = arr.

  • 究竟有什么不同和制作?
  • 为什么代码在两种情况下都会执行并提供完全相同的输出?

c arrays pointers

9
推荐指数
2
解决办法
2万
查看次数