void getnums(int *a, int *b);
int main()
{
int a;
int b;
int c;
getnums(&a,&b);
c = a + b;
printf("a + b = %d\n", c);
return 0;
}
void getnums(int *a, int *b)
{
printf("a:? ");
scanf("%d", a);
printf("b:? ");
scanf("%d", b);
}
Run Code Online (Sandbox Code Playgroud)
为什么我不需要在scanfs中的a和b之前使用&符号?(该代码目前有效.)
在这个例子中似乎两个字符串"jesus"都是等号(相同的内存位置).
printf("%p\n","jesus");
printf("%p\n","jesus");
Run Code Online (Sandbox Code Playgroud)
另请注意:
printf("%p\n",&"jesus");
printf("%p\n","jesus");
Run Code Online (Sandbox Code Playgroud)
打印相同,但:
char* ptrToString = "jesus";
char* ptrToString = &"jesus"; //ERROR
Run Code Online (Sandbox Code Playgroud)
所以我想知道如何将未分配的字符串存储在内存中以及如何指向它...
我刚刚执行了这个代码示例:
int *i = (int*) malloc( sizeof(int) );
printf( "%p, %p\n", &i , i );
Run Code Online (Sandbox Code Playgroud)
这就是我得到的:
0x7fff38fed6a8, 0x10f7010
Run Code Online (Sandbox Code Playgroud)
所以我想知道为什么第二个地址比第一个地址短?
我正在尝试实现通用链表.节点的结构如下 -
typedef struct node{
void *data;
node *next;
};
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试为数据分配地址时,假设例如对于int,例如 -
int n1=6;
node *temp;
temp = (node*)malloc(sizeof(node));
temp->data=&n1;
Run Code Online (Sandbox Code Playgroud)
如何从节点获取n1的值?如果我说 -
cout<<(*(temp->data));
Run Code Online (Sandbox Code Playgroud)
我明白了 -
`void*' is not a pointer-to-object type
Run Code Online (Sandbox Code Playgroud)
当我为其分配int的地址时,无效指针是否被转换为int指针类型?
这是什么原因?我认为如果指针为null,则不会评估其余条件.
// doesn't work:
char *ptr = somefunction();
if (ptr && ptr[0] == '1' || ptr[0] == 't')
// ...
// does work:
char *ptr = somefunction();
if (ptr)
if (ptr[0] == '1' || ptr[0] == 't')
// ...
Run Code Online (Sandbox Code Playgroud) 关于指针,我有几个问题.第一:
ObjectType *p;
p->writeSomething();
Run Code Online (Sandbox Code Playgroud)
为什么在指针尚未初始化时可以在对象上调用方法?如果我运行该代码,我会在控制台窗口中获得"writeSomething()"的输出.第二:
ObjectType *p;
if(p==NULL)
cout<<"Null pointer";//This is printed out
p = new ObjectType;
delete p;
if(p==NULL)
cout<<"Null pointer";
else
cout<<"Pointer is not null";//This is printed out
Run Code Online (Sandbox Code Playgroud)
为什么第二个if语句中的指针不为null,如何检查指针是否指向任何内存地址?我还想知道是否有任何方法可以检查程序执行完毕后是否还没有释放某些内存.例如,如果您忘记在代码中写入1个删除语句.
当我尝试传入一个数组作为参数时,我得到:
"No matching function to call to ' table::retrieve(const char[16], item&, int)'
Run Code Online (Sandbox Code Playgroud)
我试图用这个函数调用
program.reference.retrieve("Abecean Longfin", program.client_item, 1);
Run Code Online (Sandbox Code Playgroud)
功能是
int table::retrieve(char item_in[],item*item_list, int name_flag)
Run Code Online (Sandbox Code Playgroud)
我确信这是一件我不理解的简单事情,但我是新手.
我想使用本地指针指向全局字符串.指针是本地指针,字符串是全局的.当我运行此代码时,将本地指针传递给函数"myfun"时,指针不会改变,即其指向地址不会改变.打印的值为"NULL".
谁能告诉我为什么这对gcc不起作用?
#include <stdio.h>
char *str[] = { "String #1", "Another string" };
void myfun( void * p, int i )
{
p = ( void * ) &str[ i ][ 0 ];
}
int main( void )
{
void * ptr1, * ptr2;
myfun( ptr1, 0 );
myfun( ptr2, 1 );
printf( "%s\n%s\n", ptr1, ptr2 );
}
Run Code Online (Sandbox Code Playgroud) 我正在学习使用C++进行投射,之后的代码对我来说是神奇的.
#include <iostream>
using namespace std;
class Base {
public:
virtual void f() { }
};
#define SOME_VALUE 8
int main() {
cout << SOME_VALUE <<endl;
getchar();
}
Run Code Online (Sandbox Code Playgroud)
输出是:8
代码很简单,但SOME_VALUE是什么类型的?int,或double还是char?
之后更复杂:
#include <iostream>
using namespace std;
class Base {
public:
virtual void f() { }
};
#define SOME_VALUE 8
int main() {
cout << (Base*)SOME_VALUE-SOME_VALUE <<endl;
getchar();
}
Run Code Online (Sandbox Code Playgroud)
输出为:FFFFFFE8
遵循此代码,我可以理解SOME_VALUE是数字类型.我也测试sizeof(SOME_VALUE),输出为4.但如果SOME_WHAT是数字,它如何更改为对象指针?对象指针如何减去整数?
我遇到了这个奇怪的问题.基本上我有一个循环永远循环,在该循环的开始我打开一个文件,我写了一些东西到文件,然后在循环结束我关闭文件.适用于循环的第一次迭代,但在第二次迭代中我得到
*** glibc detected *** ./prog: double free or corruption (top):
Run Code Online (Sandbox Code Playgroud)
fclose(data)在循环的第二次迭代期间,我已将其缩小到该行.显然,当您释放不止一次的内容时会发生此错误,但在此代码中该怎么可能?
while(1)
{
if (data == NULL)
{
data = fopen(data_path, "w+");
}
/* do a bunch of stuff... */
if (data != NULL)
{
fclose(data);
}
}
Run Code Online (Sandbox Code Playgroud)
一个陌生的事情是,如果我fclose(data)在程序运行后添加以下行没有任何问题:
data = NULL;
Run Code Online (Sandbox Code Playgroud)
能比我更精通C的人能解释一下这里发生了什么吗?