阿海,海,
我想知道是否可以做以下事情:
class SomeClass
{
int bar;
};
SomeClass* foo = new SomeClass();
int offset = &(foo->bar) - foo;
SomeClass* another = new SomeClass();
*(another+offset) = 3; // try to set bar to 3
Run Code Online (Sandbox Code Playgroud)
只是好奇,Dan O.
我无法理解为什么下面的C代码不起作用:
int obtainStringLength(char* str, char c1, char c2) {
char* firstOcurrence = strchr(str, c1);
char* endOcurrence = strchr(str, c2);
return 2+(endOcurrence - firstOcurrence) / sizeof(char*);
}
Run Code Online (Sandbox Code Playgroud)
我们的想法是找到c1和之间有多少个字符c2:
printf("%d\n", obtainStringLength("abc def ghi", 'a', 'i')); //should yield 11
Run Code Online (Sandbox Code Playgroud)
不幸的是,这总是打印1.问题是什么?不应该strchr像C#一样工作string.IndexOf()吗?
当我使用指针算法访问特定元素时,如何更改数组中的值?
#include <stdio.h>
int main() {
int a[3] = {1, 1, 1}, b[3] = {2, 2, 2};
a++ = b++; // How can I get this to work so a[1] = b[1]?
return 0;
}
Run Code Online (Sandbox Code Playgroud) 在下面的程序中,如果我向void指针添加1,它会向前移动一个字节.但是,正如预期的那样,它分别为指针int和double指针移动4和8个字节.为什么 void指针移动1个字节,就像一个字符指针会吗?
#include<stdio.h>
int main(void)
{
int num=3,*int_ptr=#
double sum=3,*double_ptr=∑
void *void_ptr1=&num,*void_ptr2=∑
printf("%p,%p,%p,%p,%p,%p,%p,%p",void_ptr1,void_ptr1+1,\
void_ptr2,void_ptr2+1,int_ptr,int_ptr+1,double_ptr,double_ptr+1);
}
Run Code Online (Sandbox Code Playgroud) 我有下一堂课:
class A {
};
class B : public A {
int num;
};
Run Code Online (Sandbox Code Playgroud)
在我的主要我有:
int main() {
A* vec; // A is a class with pure virtual functions
vec = new B[2]; // want to create a vector of B
}
Run Code Online (Sandbox Code Playgroud)
正确定义了vec [0],但vec [1]为NULL.为什么不给我一个合适的记忆?
我不想改变主线.只是让它工作.
(我知道我可以把主要改成:B*vec = new B [2]但我不想要)
任何帮助赞赏!
请考虑以下代码:
static void Main(string[] args)
{
int max = 1024;
var lst = new List<int>();
for (int i = 1; i <= max; i *= 2) { lst.Add(i); }
var arr = lst.ToArray();
IterateInt(arr);
Console.WriteLine();
IterateShort(arr);
Console.WriteLine();
IterateLong(arr);
}
static void IterateInt(int[] arr)
{
Console.WriteLine("Iterating as INT ({0})", sizeof(int));
Console.WriteLine();
unsafe
{
fixed (int* src = arr)
{
var ptr = (int*)src;
var len = arr.Length;
while (len > 0)
{
Console.WriteLine(*ptr);
ptr++;
len--;
}
}
}
}
static void …Run Code Online (Sandbox Code Playgroud) 我正准备进行有关猜测C代码输出的编程测验.
经过长时间的尝试,我仍然在努力理解以下代码的输出:
#include <stdio.h>
char *c[] = {"GeksQuiz", "MCQ", "TEST", "QUIZ"};
char **cp[] = {c+3, c+2, c+1, c};
char ***cpp = cp;
int main()
{
printf("%s ", **++cpp);
printf("%s ", *--*++cpp+3);
printf("%s ", *cpp[-2]+3);
printf("%s ", cpp[-1][-1]+1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
产量
TEST sQuiz Z CQ
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮我理解为什么这个输出?
在这样的函数中:
char nextchr (void* p)
{
((char*)p)++;
return *(((char*)p));
}
Run Code Online (Sandbox Code Playgroud)
这应该返回传递的字符串文字的第二个字符,因为参数p根本无法做到.
为什么会这样?
@MM:
++需要一个左值(左手值)来应用它,而类型转换的结果不是那个.
@OP更新:一些编译器(通常/旧的C89// 编译器 /类似我的)可以允许((char*)source)++;/只要它不作为参数传递给函数/,即使它是非法的并且被C标准证明是非法的.
我有一个指向要在一个地址范围内逐字节移动的结构的指针。我有一种可行的方法,但在我看来却很难看。不幸的是,“不错”的方法行不通。这是一个最小的示例:
#include <stdint.h>
typedef struct {
uint32_t a;
uint32_t b;
} s_t;
int main( int argc, char** argv )
{
uint32_t address = 17;
s_t* ps = (s_t*) address;
// ugly
uint8_t* gna = (uint8_t*) ps;
++gna;
ps = (s_t*) gna;
// nice
++((uint8_t*) ps);
}
Run Code Online (Sandbox Code Playgroud)
编译器在“ nice”部分报告错误:
% gcc test.c -o test.bin
test.c: In function 'main':
test.c:17:5: error: lvalue required as increment operand
++((uint8_t*) ps);
^
Run Code Online (Sandbox Code Playgroud)
我理解该错误,但我认为强制转换为uint8_t *会创建一个左值。显然,我错了。
有没有办法使它更好?
我有以下问题; 如果a是一个带有10个元素的int数组,我可以定义指针
int*b=&a[3];
int*c=&[2];
Run Code Online (Sandbox Code Playgroud)
然后,我可以使用这些指针进行算术运算,int d=a-c;这将返回b和c之间数组中int值的数量.所以我的问题是,如果我也被允许对任何可能不在数组中的变量进行这样的指针算术运算.例如:
int a=10;
int b=20;
int*c=&a;
int* d=&b;
Run Code Online (Sandbox Code Playgroud)
然后做int e=d-c;或int*e=c+1;
我问的原因是我收到了有关这是否会导致未定义行为的相互矛盾的信息,