标签: pointers

如何编写更好的strlen函数?

我正在阅读"写大代码卷2",它显示了以下strlen inslementation:

int myStrlen( char *s )
{
    char *start;
    start = s;
    while( *s != 0 )
    {
        ++s;
    }
    return s - start;
}
Run Code Online (Sandbox Code Playgroud)

该书说,这种实现对于没有经验的C程序员来说是典型的.在过去的11年里,我一直在使用C语言进行编码,我无法在C中看到如何编写比这更好的函数(我可以想到在汇编中编写更好的东西).如何在C中编写比这更好的代码?我看了glibc中strlen函数的标准库实现,我无法理解它的大部分内容.在哪里可以找到有关如何编写高度优化代码的更好信息?

c string optimization pointers c-strings

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

通过解除引用NULL指针来分配引用

int&  fun()
{
    int * temp = NULL;
    return *temp;
}
Run Code Online (Sandbox Code Playgroud)

在上面的方法中,我试图取消引用NULL指针.当我调用此函数时,它不会给出异常.我发现当返回类型是引用时它不会给出异常,如果它是按值,那么它.即使将NULL指针的解引用引用为引用(如下面的行),它也不会给出.

int* temp = NULL:
int& temp1 = *temp;
Run Code Online (Sandbox Code Playgroud)

在这里我的问题是,在引用的情况下编译器是否进行解除引用?

c++ pointers reference null-pointer undefined-behavior

12
推荐指数
2
解决办法
5451
查看次数

Javascript相当于通过引用分配?

有没有什么方法可以通过将局部变量指向对象属性来减少Javascript中的冗长?

例如在PHP中,我可以这样做:

$obj->subobject->property = 'Foo';
$property =& $obj->subobject->property;
$property =  'Bar';
echo $obj->subobject->property;
// output 'Bar'
Run Code Online (Sandbox Code Playgroud)

这不是一个很好的例子,但你明白了.

我想在Javascript中复制此行为.我经常不得不深入到对象中,这样做非常烦人:

if (please.stop.making.me[somevar].type.so.much.length) {
    please.stop.making.me[somevar].type.so.much[newSubObjectKey] = anObject;
}

// perform more operations on the object down here
Run Code Online (Sandbox Code Playgroud)

它会更容易阅读,更容易输入:

var subObj = is.much.easier.to.type.once;
if (subObj.length) {
     subObj[newSubObjectKey] = anObject;
}

// now that's much better
Run Code Online (Sandbox Code Playgroud)

我知道我应该知道这一点,但我只是在Javascript中推进"高级新手".

javascript php pointers

12
推荐指数
2
解决办法
8157
查看次数

什么是char*const argv []?

我看到的时候正在研究linux C++编程

int execve(const char *path,
           char *const argv[],
           char *const envp[]);
Run Code Online (Sandbox Code Playgroud)

我不明白是什么char *const argv[].我知道char *const foo是一个指向char的const指针.并且const char *foo是一个指向const char的指针.但是什么char *const argv[]

它是char的const指针数组还是const char的指针数组?

我有一个vector<string>现在,如何将其转换为char *const argv[]

c++ pointers const exec char

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

C比较指针(用字符)

晚上好,我有2个函数,每个函数都接受一个指向char的指针作为参数:

char pointer[255];
func1(char* pointer)
{
...
memcpy(pointer,some_char,strlen(something));
return;
}
func2(char* pointer)
{
...
if (pointer==someother_char) exit(0); //FAILs
//also I have
if(pointer==someother_pointer2char); // FAILs
}
Run Code Online (Sandbox Code Playgroud)

现在我尝试了strstr,strcmp等......不起作用.想尝试memcmp,但我没有静态len.因为我必须将char*与charchar*比较为char*我需要两个解决方案吗?

那么,如何以最短的方式比较这些指针(实际上是指针)?

谢谢.

编辑

感谢wallacer和Code Monkey现在用于char*to char比较我使用以下:

func1(char* ptr){
char someother_char[255];
char *ptr_char = NULL; //I have to strcmp a few values so this is why I initialize it first
... 
ptr_char = someother_char;
if (strcmp(ptr,ptr_char) == 0) //gtfo and it does...
...
ptr_char = some2nd;
if(strcmp... …
Run Code Online (Sandbox Code Playgroud)

c string pointers compare

12
推荐指数
1
解决办法
6万
查看次数

在PHP中,当我们使用mysql_query时,内存中会发生什么

我曾经使用mysql_query获取大量数据,然后逐个遍历结果来处理数据.例如:

$mysql_result = mysql_query("select * from user");
while($row = mysql_fetch_array($mysql_result)){
    echo $row['email'] . "\n";
}
Run Code Online (Sandbox Code Playgroud)

最近我查看了一些框架并意识到他们将所有数据提取到内存中的数组并返回数组.

$large_array = $db->fetchAll("select * from user");
foreach($large_array as $user){
    echo $user['email'] . "\n";
}
Run Code Online (Sandbox Code Playgroud)

我想知道每种方法的优缺点.在我看来,如果你有一个很长的项目列表,将所有内容加载到内存中会导致灾难.但话说回来,一位同事告诉我,无论如何,mysql驱动程序必须将结果集放入内存中.我想得到一个明白问题是关于绩效的人的意见.请不要对代码发表评论,我只是把它作为帖子的一个例子.

谢谢

php mysql memory heap pointers

12
推荐指数
1
解决办法
895
查看次数

C函数是否保证具有固定的内存地址?

如果我存储指向函数的指针,然后在程序执行期间的某个稍后点,将它与同一函数的地址进行比较,两个地址是否保证相等.

例如

int foo(void){return 0;}
int (*foo_p)(void) = &foo;

assert(foo_p == &foo);
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,断言始终保证成功吗?是否有任何情况下函数的地址可以改变?

c pointers function-pointers

12
推荐指数
1
解决办法
318
查看次数

转换指针不会产生左值.为什么?

发布我最有争议的一个回答后在这里,我不敢问几个问题,并最终在我的知识填补一些空白.

为什么不是一种((type_t *) x)被认为是有效左值的表达式,假设它x本身是指针和左值,而不仅仅是某个表达式?

我知道很多人会说"标准不允许它",但从逻辑的角度看它似乎是合理的.标准不允许的原因是什么?毕竟,任何两个指针都具有相同的大小,指针类型只是一个编译时抽象,指示在进行指针运算时应该应用的适当偏移量.

c pointers casting lvalue

12
推荐指数
2
解决办法
3925
查看次数

这个错误暗示了什么?

当我试图执行我的程序时它得到的错误是这样的 -

sendip: malloc.c:4631: _int_malloc: Assertion `(unsigned long)(size)
 >= (unsigned long)(nb)' failed
Run Code Online (Sandbox Code Playgroud)

通过valgrind尝试捕获错误,得到了这个 -

   HEAP SUMMARY:
   ==3335==     in use at exit: 24 bytes in 2 blocks 
   ==3335==   total heap usage: 111 allocs, 109 frees, 7,929 bytes allocated
   ==3335== 
   ==3335== 4 bytes in 1 blocks are definitely lost in loss record 1 of 2
   ==3335==    at 0x40268A4: malloc (vg_replace_malloc.c:236)
   ==3335==    by 0x8049EEF: main (sendip.c:435)
   ==3335== 
   ==3335== 20 bytes in 1 blocks are definitely lost in loss record 2 of 2
   ==3335== …
Run Code Online (Sandbox Code Playgroud)

c malloc pointers memory-leaks

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

C++,需要错误原因:无法将参数1从'char*'转换为'const char*&'

乳清我们不能将指针转换为字符 - > TO->对指向常量字符的指针的引用

当我们调用foo_ptr时,我有兴趣知道语法错误的原因.当允许foo_char时,为什么不foo_ptr.
[更新1.]我很高兴知道有效的原因foo_char(),为什么foo_ptr()不工作..当指针出现在图片中时会发生什么.

[更新2.]也没有在Dev C++编译器版本4.9.9.2中工作..

//code
//OS : Win XP
//Env: VC++ 2008 

//NOT ALLOWED
void foo_ptr(const char * & ptr) //reference to a pointer to a constant character         
{         
        return;         
}        


//allowed        
void foo_char(const char & p_Char) //reference to a constant character        
{         
        return;        
}        

int main()        
{        
        char ch = 'd';        
        char *ptr =  "anu";        

        foo_char(ch);         
        foo_ptr(ptr); //NOT ALLOWED syntax error, vc++, 2008        

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

c++ pointers reference visual-c++

12
推荐指数
2
解决办法
3916
查看次数