假设我有一个数组
int arr[] = {...};
arr = function(arr);
Run Code Online (Sandbox Code Playgroud)
我有这个功能
int& function(int arr[])
{
//rest of the code
return arr;
}
Run Code Online (Sandbox Code Playgroud)
我在这里犯了什么错误?
我有以下代码:
typedef struct Test {
long mem[1000];
} Test;
extern Test *test;
int main() {
Test *test = (Test *)malloc(sizeof(Test));
test->mem[0] = 1;
test->mem[1] = 2;
test->mem[2] = 3;
test->mem[3] = 4;
test->mem[4] = 5;
test->mem[5] = 6;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它工作正常,但我想以这种方式改变mem数组的初始化:
test->mem = {1,2,3,4,5,6};
Run Code Online (Sandbox Code Playgroud)
但是gcc给了我这个错误:
错误:'{'token test-> mem = {1,2,3,4,5,6}之前的预期表达式; 用箭头指向左侧开括号.
它可以是什么?
谢谢!
编辑: 我也尝试这个代码:
long mem[1000] = {1,2,3,4,5,6};
test->mem = mem;
Run Code Online (Sandbox Code Playgroud)
我从gcc得到这个错误:
错误:从类型'long int*'test-> mem = mem中分配类型'long int [1048576]'时出现不兼容的类型;
我不允许使用任何C函数.
我是 C 编程新手。我知道char *和char[]数组是不同的。然而,当涉及到函数参数时,您可以扣除char[]to 。char *所以函数声明可能是相同的。
但是我如何知道该函数是否专门需要一个char数组,而不是char *通过查看签名(声明)?
例如,如果我使用库头文件并且函数如下。我如何知道要通过哪一项?
// somelib.h
void foo(char *bar);
Run Code Online (Sandbox Code Playgroud)
因为如果函数正在修改bar参数并且我传递 a char *,它将出现段错误。这是针对 C 的,但是对于 C++ 来说也是一样的吗?
众所周知,数组名称不能分配,句子如:
char * array[], * point;
array = point; /* wrong */
array++; /* wrong */
Run Code Online (Sandbox Code Playgroud)
但是main(int argc, char * argv[]),argv++好的,运作良好.我错过了什么?
请记住一个让我烦恼的问题.
我知道pointers,并arrays在C不同,因为pointers存储的address,而arrays商店'real' values.
但是当涉及到时我会感到困惑string.
char *string = "String";
Run Code Online (Sandbox Code Playgroud)
我读到这行做了几件事:
编译器创建一个字符数组,它具有值String.
然后,该数组被认为是a pointer,程序将指针分配给指针字符串,该指针指向first element编译器创建的数组.
这意味着,arrays被视为pointers.
那么,这个结论是真是假,为什么呢?
如果是假,什么是那么之间的差异pointers和arrays?谢谢.
我有一个二维数组,可以使用一个函数:
bool matrix[rows][cols];
func(rows, cols, matrix);
void func(int rows, int cols, bool matrix[rows][cols]) {
//...
}
Run Code Online (Sandbox Code Playgroud)
但是,只要我尝试matrix修改原始函数:
bool matrix[rows][cols];
func(rows, cols, &matrix);
void func(int rows, int cols, bool *matrix[rows][cols]) {
//...
}
Run Code Online (Sandbox Code Playgroud)
我收到一个不兼容的指针类型错误.我对此无能为力.
在 x86_64 架构上,一个指针是 8 个字节。对我来说sizeof(x)应该返回 8是有意义的。我知道 achar是单个字节,而 5 个字节是 array 的大小z。为什么sizeof(z)不返回8背后的直觉是什么?
int* x = new int[10];
char z[5];
// Returns 8
std::cout << "This is the size of x: " << sizeof(x) << std::endl;
// Returns 5
std::cout << "This is the size of z: " << sizeof(z) << std::endl;
Run Code Online (Sandbox Code Playgroud) 请原谅我的无知,在我看来,这std::array意味着您的常规数组的 STL 替代品。但是因为数组大小必须作为模板参数传递,它阻止我们std::array使用仅在运行时已知的大小进行创建。
std::array<char,3> nums {1,2,3}; // Works.
constexpr size_t size = 3;
std::array<char,size> nums {1,2,3}; // Works.
const buf_size = GetSize();
std::array<char, buf_size> nums; // Doesn't work.
Run Code Online (Sandbox Code Playgroud)
我认为 C++ 中数组的一个非常重要的用例是基于运行时输入创建一个固定大小的数据结构(比如为读取文件分配缓冲区)。
我为此使用的解决方法是:
// Create a array pointer for on-the-spot usecases like reading from a file.
char *data = new char[size];
...
delete[] data;
Run Code Online (Sandbox Code Playgroud)
或者:
// Use unique_ptr as a class member and I don't want to manage the memory myself.
std::unique_ptr<char[]> myarr_ = std::unique_ptr<char[]>(new char[size]);
Run Code Online (Sandbox Code Playgroud)
如果我不关心固定大小,我知道我可以使用 …
为什么下面的C++代码无法编译?
#include <utility>
int main() {
int x[6];
int y[6];
std::pair<int[6], int[6]> a(x, y);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
例如 MSVC 给出以下错误:
错误 C2661: 'std::pair<int [6],int [6]>::pair': 没有重载函数需要 2 个参数
感谢使用C++替代品构造数组的评论,但我也想知道代码无法编译的原因。