文件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)
给我一个段错误!出了什么问题?
考虑:
#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) 考虑:
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[]常量?
我有一个int指针数组,int* arr[MAX];我想将其地址存储在另一个变量中.如何定义指针数组的指针?即:
int* arr[MAX];
int (what here?) val = &arr;
Run Code Online (Sandbox Code Playgroud) 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)
第一个工作,但第二个不工作.我不明白为什么会这样.
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]"
-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) 将数组显式衰减为指针的最简洁和惯用的方法是什么?
例如,考虑一下您需要能够指导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) 当我尝试在gcc 4.8.2中编译以下代码时,我收到以下错误:
Run Code Online (Sandbox Code Playgroud)test.cc: In function ‘void foo(int*)’: test.cc:15:16: error: no matching function for call to ‘begin(int*&)’ for (int i : bar) { ^
与模板库中更深层次的其他一些人一起.
#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,我也会得到预期的行为.
如何bar以foo一种能够在其上执行基于范围的for循环的方式传递数组?
#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像数组一样输入的函数参数来输出不同的值?
当我使用这段代码时,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.